Arduino Uno : Servo と AltSoftSerial は同時に使用できない


Arduino Uno で Servo クラスと AltSoftSerial クラスを同時に使用すると、コンパイル・エラーになります。

multiple definition of `__vector_11'

どちらのクラスも16ビットタイマーを必要としていて、そのための割込みが衝突しています。
Arduino Uno のハード仕様による制約で、回避する方法はありません。

対策として、Arduino Mega などハード仕様を満たすものを使う方法もありますが。
ひとまず、SoftSerial クラスを使って凌ぎました。

参考
AltSoftSerial and Servo libraries fails to compile


Arduino 連続回転サーボ


20160425_arduino_servo

一般的なサーボ は、180度くらいの可変範囲を持っています。
連続回転サーボ (Continuous Rotation Servo) は、360度以上の可変範囲を持ち、連続して回転することができます。
モータの代わりに使用することができます。

今回は、SpringRC SM-S4303R を使用しました。
国内では扱っているところがなかったので、米国の Pololu から購入しました。

制御信号
制御信号は、周期的なパルスで、周期 20ms、パルス幅 1.0ms – 2.0ms です。
パルス幅 1.5ms で停止、1.0 – 1.5ms で時計周り、1.5 – 2.0ms で反時計周りです。
停止の 1.5ms から離れるに従い回転数が増えます。
20160425_servo_control_2

Arduino で制御する
サーボには3本の線があります。
赤を+5v、黒をGND、白を制御ピンに接続します。

(1) digitalWrite
制御信号を digitalWrite で生成します。
width を 1000、1400、1500、1600、2000 と変化させて、
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認します。

servo-digitalwrite.ino

 
int PIN = 13;
int width = 1500;
void setup() {
 	pinMode(PIN, OUTPUT);
}
void loop() {
	digitalWrite(PIN, HIGH);
	delayMicroseconds(width);
	digitalWrite(PIN, LOW);
	delayMicroseconds(3000 - width);
	delay(17); // wait 17 ms
}

(2) Servo クラス
Arduino には、サーボ制御のためのクラス Servo が用意されています。ハードウェア・タイマーを利用しています。
Servo#write で、回転のスピードを設定します。0にするとフルスピードで回転し、180にすると、反対方向にフルスピードで回転します。90のときは停止します。

speed を 0、80、90、100、180 と変化させて、
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認します。

servo-test.ino

 
#include <Servo.h>
Servo myservo;
int PIN = 13;
int speed = 90;
void setup() { 
	myservo.attach(PIN);
	myservo.write(speed);
} 
void loop() {}

(3) コマンド
パラメータを変えるたびに、プログラムを書き換えるのは面倒です。
シリアルモニタからコマンドを送って、変更できるようにしました。
servo_command.ino

コマンドの形式は、s + 3桁の数字です。

s000 : 時計周り 高速
s090 : 停止
s180 : 反時計周り 高速

参考
Pololu SM-S4303R
SM 33R/43R/81R Datasheet
Servo#write : Arduino日本語リファレンス


ラズパイ カーネルのビルド


Ubuntu環境で、ラズパイのカーネルをビルドする。

ツール
インストール

$ mkdir raspi
$ cd raspi
$ git clone https://github.com/raspberrypi/tools

PATHの設定

$ export PATH="$HOME/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian:$HOME/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH"

ソースコード

$ git clone --depth=1 https://github.com/raspberrypi/linux

defconfig の作成 (Raspberry Pi 2)

$ cd linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

カーネルのコンパイル
1時間くらいかかります

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

SDカードへの書込み
SDカードのデバイス名を調べる

$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5
/dev/sdb  /dev/sdb1  /dev/sdb2

SDカードのマウント

$ mkdir mnt
$ mkdir mnt/fat32
$ mkdir mnt/ext4
$ sudo mount /dev/sdb1 mnt/fat32
$ sudo mount /dev/sdb2 mnt/ext4

SDカードへの書込み

(ext4)
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
(カーネルのバックアップ)
$ sudo cp -p mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
(fat32)
$ sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img
$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

SDカードのアンマウント

$ sudo umount mnt/fat32
$ sudo umount mnt/ext4

ラズパイでの確認
ラズパイにSDカードを挿して、電源を入れる。
無事にブートするかを確認する。
カーネル・バージョンを確認する。

$ uname -a
Linux raspberrypi 4.4.8-v7+ #1 SMP Tue Apr 26 01:16:11 JST 2016 armv7l GNU/Linux

2016-03-18-raspbian-jessie.img のカーネル・バージョン

Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux

参考
Raspberry Pi – KERNEL BUILDING
Raspberry Pi 2のカーネルをビルドしてみた


MAC で hello.c をARMバイナリにクロスコンパイルする


(1) Ubuntuの環境をつくる
MAC で Ubuntu を動かす (VirtualBox)

以降、Ubuntu環境です
(2) ARMの開発環境をインストールする

$ sudo apt-get install g++-arm-linux-gnueabihf

(3) hello.c をクロスコンパイルする
hello.c

#include <stdio.h>
int main(int argc, char *args[])
{
    printf("Hello, world!\n");
}

クロスコンパイルする

$ arm-linux-gnueabihf-gcc hello.c -o hello

実行すると、実行できないよというメッセージが出る

$ ./hello
bash: ./hello: cannot excute binary file:

(4) ARMの実行環境をインストールする

$ sudo apt-get install qemu-user qemu-user-static

環境設定する

$ update-binfmts --display qemu-arm
$ cd /lib/
$ sudo ln -s /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 .
$ sudo ln -s /usr/arm-linux-gnueabihf/lib arm-linux-gnueabihf

実行すると、今度はOK

$ ./hello
Hello, world

(5) ラズパイで実行する
ラズパイに転送して、実行します。OKでした。

参考
Ubuntu 12.04 で hello.c をARMバイナリとしてコンパイルして実行してみる

debian – binfmt-support
binfmt_misc というカーネルモジュールは、システム管理者がファイル拡張子をベースにして各種バイナリ 形式をインタプリタに登録し、該当するファイルが実行された時には適切な インタプリタが呼び出されるようにできます。


VirtualBox ホストOSからゲストOSにアクセスする


ホストOSはMACで、からゲストOSはUbuntuです。

VirtualBox は初期状態では、NATに設定されています。
この状態では、ゲストOSからホストOSにアクセスできます。

$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=63 time=0.164 ms

ホストOSからゲストOSにアクセスするには、「ホストオンリーネットワーク」を追加します。
VirtualBox -> ゲストOSの設定 -> ネットワーク -> アダプタ2
20160420_virtualbox_host_only

ゲストOSにて、sshをインストールする。

$ sudo apt-get install ssh

ゲストOSにて、IPアドレスを調べる。

$ Ipconfig
enp0s8    Link encap:イーサネット  ハードウェアアドレス 08:00:27:d5:17:a1  
          inetアドレス:192.168.99.100  ブロードキャスト:192.168.99.255  マスク:255.255.255.0

ホストOSからアクセスする

$ ping 192.168.99.100
PING 192.168.99.100 (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.531 ms
$ ssh user@192.168.99.100
user@192.168.99.100's password: 
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64)

参考
VirtualBoxでホストOS<->ゲストOS間 ゲストOS->インターネット間の通信を行う方法
VirtualBox ネットワーク設定


Windows とラズパイをLANケーブルで直結する


Windows とラズパイをLANケーブルで直結します。
Windows は、ラズパイから見ると、ルータになります。
Windows からラズパイに ssh で接続します。
ラズパイから、Windows の無線LAN経由で、インターネットに接続します。

結論から言うと、うまくいかなかったです。
Windows からラズパイに ssh 接続は出来ました。
ラズパイからインターネットへの接続は出来ませんでした。
20160425_win_direct_diagram

ラズパイの設定
ssh接続 ができれば、特に設定はありません。

Windows 7 の設定
ネットワークの設定が必要でした。
コントロールシパネル -> ネットワークとインターネット
ワイヤレスネットワーク接続とローカルエリア接続の2つのネットワークがあります。
20160425_win_direct_network_common

「ローカルエリア接続」をクリックして、「ローカルエリア接続の状態」を開きます。
20160425_win_direct_network_status

「プロパティ」をクリックして、「ローカルエリア接続のプロパティ」を開きます。
「インターネット・プロトコル・バージョン6」のチェックを外します。
20160425_win_direct_network_property

ssh接続
Windows からラズパイに ssh で接続する
Tera Term を起動します。
ホストに「raspberrypi.local」を入力して、「OK」をクリックします。
20160425_win_direct_ssh_connection

ユーザ名「pi」とパスフレーズ「raspberry」を入力して、「OK」をクリックします。
20160425_win_direct_ssh_connection

ログインすると、下図のような表示が出ます。
20160425_win_direct_ssh_login

参考
Raspberry Piをモニターとキーボードなしで導入する


ラズパイ 無線LANの設定


無線LAN は、無線通信を利用してデータの送受信を行うLANシステムのことです。WLAN( Wireless LAN ) とも呼ばれます。
WiFi とも呼ばれますが、これは Wi-Fi Alliance によって認定された無線LANの規格のことです。

設定
ラズパイに無線LANドングルを差す。
SSID と PASSPHRASE を指定して、/etc/wpa_supplicant/wpa_supplicant.conf に追記する

$ sudo sh -c 'wpa_passphrase YOUR_SSID YOUR_PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'

設定前

$ cat /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

設定後

$ cat /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
# 下記が追加されている
network={
	ssid="YOUR_SSID"
	#psk="YOUR_PASSPHRASE"
	psk=3195a94c445ee8b8160002f5621ca6b195543c75fa95744cef4c87cf6e693dea
}

確認
下記のように wlan が表示されれば、OK

$ sudo /etc/init.d/networking restart
$ ifconfig
...
wlan0     Link encap:Ethernet  HWaddr cc:e1:d5:3e:33:87  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

再起動する

$ sudo reboot

パソコンから ping コマンドを打って、応答が返ってくれば、OK

$ ping raspberrypi.local

参考
SETTING WIFI UP VIA THE COMMAND LINE
raspberry pi2 で 無線 LAN 設定まで


MAC と ラズパイ をLANケーブルで直結する


20160410_mac_connection_direct

MAC と ラズパイ をLANケーブルで直結します。
MAC は、ラズパイから見ると、ルータになります。
MAC からWiFi経由で、インターネットに接続します。

ラズパイの設定
ssh接続 ができれば、特に設定はありません。

MACの設定
インターネット共有の設定が必要です。
システム環境設定 -> 共有 から
サービスに「インターネット共有」、共有する接続経路に「WiFi」、相手にコンピュータのポートに「Thnderbolt Ethernet」を設定します。
20160410_mac_share

ssh接続
MAC からラズパイに ssh で接続する

$ ssh pi@raspberrypi.local

参考
mac の、「インターネット共有」を使って Raspberry Pi と接続する (外でRaspberry-Piと接続する時などに)


ラズパイ VNC 接続


VNC (Virtual Network Computing) は、ネットワーク上の離れたコンピュータをGUIで遠隔操作するためのリモートデスクトップソフトです。
パソコンとラズパイは、ローカルネット内で有線LANかWiFiで接続します。

インストール

$ sudo apt-get install tightvncserver

設定
パスワードを設定する。ここでは「raspberry」とします。

$ tightvncserver

You will require a password to access your desktops.
Password: <==
Warning: password truncated to the length of 8.
Verify: <==   
Would you like to enter a view-only password (y/n)? y
Password: <== 
Warning: password truncated to the length of 8.
Verify:  <==  
New 'X' desktop is raspberrypi:1
Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log

こちらを参考に /etc/init.d/vncboot を作成します。
作成したスクリプトを Github で公開しました。

Windows 編
UltraVNC を使用します。

インストール
UltraVNCのサイト からダウンロードします。
ダウンロードした UltraVNC_1_2_10_X64_Setup.exe をダブルクリックして、インストールします。
20160410_win_vnc_install

UltraVNC を起動します。
VNCに「raspberrypi.local:5901」を入力して、「Connect」をクリックします。
20160410_win_vnc_setting

Password に「raspberry」を入力して、「LogOn」をクリックします。
20160410_win_vnc_password

ラズパイのGUI画面が表示されます。
20160410_win_vnc_login

MAC 編
Finder から接続します。
移動 -> サーバーへ接続
20160410_mac_vnc_menu

サーバーアドレスに「vnc://raspberrypi.local:5901」を入力して、「接続」します。
20160410_mac_vnc_connect

パスワードに「raspberry」を入力して、「接続」します。
20160410_mac_vnc_password

ラズパイのGUI画面が表示されます。
20160410_mac_vnc_desktop

参考
Raspberry Piで遊ぼう [No.5:VNC接続をしよう] [Raspberry Pi]
Raspberry Piの設定【VNCサーバ(tightVNC)の設定】

参考
Raspberry Pi – VNC (VIRTUAL NETWORK COMPUTING)
CONNECTING TO A PI OVER VNC USING WINDOWS
CONNECTING TO A PI OVER VNC USING MAC OS


ラズパイ ssh接続


20160410_ssh_connection_lan

SSH (Secure Shell) は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルです。
ラズパイでは、デフォルトで、sshサーバーが起動されています。

パソコンとラズパイは、ローカルネット内で有線LANかWiFiで接続します。

Windows 編
TeraTerm を使用します。

インストール
OSDN からダウンロードします。
ダウンロードした teraterm-4.90.exe をダブルクリックして、インストールします。
20160410_teramterm_install

Tera Term を起動します。
ホストに「raspberrypi.local」を入力して、「OK」をクリックします。
20160410_win_ssh_connection

ユーザ名「pi」とパスフレーズ「raspberry」を入力して、「OK」をクリックします。
20160410_win_ssh_password

ログインすると、下図のような表示が出ます。
20160410_win_ssh_login

MAC 編
標準の ssh コマンド で接続します。

$ ssh pi@raspberrypi.local

SSHキーのパスワードを要求されますが、「キャンセル」をクリックします。
20160410_mac_ssh_password

パスワードの要求をしてこないためには、オプションを指定します。

$ ssh pi@raspberrypi.local -o PreferredAuthentications=password

接続すると、ラズパイのパスワードを要求されます。デフォルトは「raspberry」です。

The authenticity of host 'raspberrypi.local (2408:211:4085:810:d3f8:bacf:d694:4cbf)' can't be established.
ECDSA key fingerprint is SHA256:nMAP+ZpXx/jIUEVgd9L0WN/X9O3Xb4gDMEnRJYbso+Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'raspberrypi.local,2408:211:4085:810:d3f8:bacf:d694:4cbf' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password: <==

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Apr 23 01:05:53 2016 from 2408:211:4085:810:6a5b:35ff:fecc:a6da
pi@raspberrypi:~ $ 

参考
SSH USING WINDOWS
SSH USING LINUX OR MAC OS
Raspberry PiをWindowsで操作する(SSH)
MacからRaspberry Pi(ラズベリーパイ)にSSHでリモートログインする