WiringPi」タグアーカイブ

Raspberry Piの初期設定 – Raspbian

Arch Linuxで開発を進めてきたハウスローバーですが、先日、いつもの様にシステムのアップデートを実施したところ、 パッケージマネージャのデータベースが破損したとのメッセージを出力し、pacmanが使用できなくなってしまいました。

修復を試みましたが、上手く行かず、再セットアップした方が早そうです。 それならと、最新のRaspbianに切り替えることにしました。

重い印象だったRaspbianですが、CUIではArch Linuxと大差なさそう。 それとも改善しているのでしょうか。

raspbian_img

Raspbianの初期設定

・パッケージ更新
sudo apt-get update
sudo apt-get upgrade

・ネットワーク設定
sudo nano /etc/network/interfaces
/etc/network/interfacesの内容
—————————————-
auto lo wlan0 eth0

iface lo inet loopback
address 127.0.0.1
netmask 255.0.0.0

iface eth0 inet static
address 192.168.0.XX
netmask 255.255.255.0
network 192.168.0.0

iface wlan0 inet static
address 192.168.0.XX
netmask 255.255.255.0
network 192.168.0.0
gateway 192.168.0.XX
wireless-essid XXXXX
wireless-key XXXXXXXXXX
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
—————————————-
(セキュリティ設定がWEPの場合、上記設定のみで繋がりますが下記ネットワークマネージャーで設定した方が安定しました)

・ワイヤレス用ネットワークマネージャー
sudo apt-get install wicd-curses
インストール後、wicd-cursesで設定画面へ

・DNS設定
sudo nano /etc/resolv.conf
nameserver 192.168.0.XX

・ネットワーク設定の適用
sudo /etc/init.d/networking reload

・Apacheインストール
sudo apt-get install apache2

・PHP5インストール
sudo apt-get install php5

・PHPキャッシュモジュールAPCインストール
sudo apt-get install php-apc

・mjpg_streamerのインストール
sudo apt-get install subversion
sudo apt-get install libjpeg-dev imagemagick
svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
cd mjpg-streamer
make
mjpg_streamerをバックグランドで起動
(インストールディレクトリで実行)
sudo ./mjpg_streamer -b -i “./input_uvc.so -f 20 -r 320×240 -d /dev/video0 -y” -o “./output_http.so -w ./www -p 8080”

・ServoBlaster
git clone git://github.com/richardghirst/PiBits.git
cd PiBits/ServoBlaster/user
make servod
sudo make install
起動オプション
–idle-timeout=2000 –p1pins=7,11

・WebIOPiのインストール
wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
tar xvzf WebIOPi-0.6.0.tar.gz
cd WebIOPi-0.6.0
sudo ./setup.sh
サービス起動 sudo /etc/init.d/webiopi start
サービス停止 sudo /etc/init.d/webiopi stop

・Wiring Piのインストール
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

・I2Cの使用
i2c-devのロード
sudo modprobe i2c-dev
自動起動の為/etc/modulesにi2c-devを追加
nano /etc/modules
i2c-toolsのインストール
sudo apt-get install i2c-tools
状態表示
i2cdetect 1

・CGIをroot権限で実行する為の設定
sudo の設定ファイル (/etc/sudoers) を編集する
www-data ALL=(root) NOPASSWD:ALL を追加

追加項目

・webminインストール
sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.660_all.deb
sudo dpkg –install webmin_1.660_all.deb
sudo /usr/share/webmin/changepass.pl /etc/webmin root <rootのパスワード>
https://<raspberrypiのIPアドレス>:10000/

・sambaをインストール
sudo apt-get install samba samba-common-bin
sambaの設定
sudo nano /etc/samba/smb.conf
以下を追加
—————————————-
[share]
comment = share drive
read only = no
locking = no
path = /var/www
guest ok = yes
force user = <sambaユーザー名>
—————————————-
パスワードを設定
sudo smbpasswd -a <sambaユーザー名>
New SMB password:<sambaユーザーパスワード>
Retype new SMB password:<sambaユーザーパスワード>
smanbaを再起動
sudo service samba restart

コマンド等

・デバイス表示(主にUSBデバイスの確認)
lsusb

・GPIOの状態表示
gpio readall

・wiringPiのライブラリを指定してコンパイル
gcc xxxxxx.c -o xxxxxx -I/usr/local/include -L/usr/local/lib -lwiringPi

 

 参考にさせていただいたサイト

人と技術のマッシュアップ – Raspberry PiでGPIO制御

sstea備忘録 – Raspberry Pi の最適化を試みる

ものづくりエクスペリメント – メモリーを節約する

 

WiringPiでPWM制御する

Raspberry Piには、ハードウェアのPWMが1チャンネル開放されています。 速度制御の目的であれば1チャンネルでも可能ですが、より細かな制御が必要となった時の為にWiringPiのsoftpwmを検証しておきたいと思います。

開発中

簡単なコードを書いて実行してみると、 ん?なんか予想と違う動き…。

PWM出力を設定したCのプログラムが終了するとPWMも停止してしまいます。 希望としては停止コマンドを送るまでは継続して欲しいのですが…。 コードのミス?仕様?

作者のサイトをよくよく確認すると、こんな注意書きが。

There is currently no way to disable softPWM on a pin while the program in running.
You need to keep your program running to maintain the PWM output!

PWMを実行中に無効にすることはできず、出力を維持するにはプログラムを実行し続ける必要がある。 って、仕様だったのです。

実際に組み込む際はこの辺りを考慮するとして、今回は実験用のコードを書いてみました。

#include <stdio.h>
#include <wiringPi.h>

#define MOTOR1 22			// GPIO22
#define MOTOR2 23			// GPIO23
#define MOTOR3 24			// GPIO24
#define MOTOR4 25			// GPIO25
#define RANGE 100			//PWM最大値
#define LEFT_STR "l"
#define RIGHT_STR "r"
#define FWRD_STR "f"
#define BACK_STR "b"
#define STOP_STR "s"

int main(int argc, char **argv)
{

	// 引数をチェック
	if ( argc < 4 ) return;

	// 速度を設定
	int pwm = atoi(argv[2]);

	// WiringPi初期化
	if(wiringPiSetupGpio() == -1) return;

	// softPWM設定
	softPwmCreate(MOTOR1,0,RANGE);
	softPwmCreate(MOTOR2,0,RANGE);
	softPwmCreate(MOTOR3,0,RANGE);
	softPwmCreate(MOTOR4,0,RANGE);

	if ( strcmp( argv[1], STOP_STR ) == 0 ){
		//停止
		softPwmWrite(MOTOR1, 0);
		softPwmWrite(MOTOR4, 0);
		softPwmWrite(MOTOR2, 0);
		softPwmWrite(MOTOR3, 0);
		return;
	} else if ( strcmp( argv[1], FWRD_STR ) == 0 ){
		//前進
		softPwmWrite(MOTOR2,pwm);
		softPwmWrite(MOTOR4,pwm);
	} else if ( strcmp( argv[1], BACK_STR ) == 0 ){
		//後退
		softPwmWrite(MOTOR1,pwm);
		softPwmWrite(MOTOR3,pwm);
	} else if ( strcmp( argv[1], LEFT_STR ) == 0 ){
		//左ターン
		softPwmWrite(MOTOR1,pwm);
		softPwmWrite(MOTOR4,pwm);
	} else if ( strcmp( argv[1], RIGHT_STR ) == 0 ){
		//右ターン
		softPwmWrite(MOTOR2,pwm);
		softPwmWrite(MOTOR3,pwm);
	}
	// 時間待ち
	delay(atoi(argv[3]) * 100);

	// ブレーキ
	softPwmWrite(MOTOR1,RANGE);
	softPwmWrite(MOTOR4,RANGE);
	softPwmWrite(MOTOR2,RANGE);
	softPwmWrite(MOTOR3,RANGE);
	delay(500);
	// 停止
	softPwmWrite(MOTOR1, 0);
	softPwmWrite(MOTOR4, 0);
	softPwmWrite(MOTOR2, 0);
	softPwmWrite(MOTOR3, 0);

	return 0;
}

実行は、第1引数に移動方向(f,b,l,r)、第2引数に速度(0~100)、第3引数に実行時間(0.1s単位)を指定します。
例えば

./motor_pwm f 75 30

と、指定することにより、75%の速度で3秒間前進します。

動きは滑らかで良いのですが、ソフトPWMでいくか、ハードPWMにするかはもう少し検討してみます。

 

Raspberry Piの初期設定 – Arch Linux

Raspberry PiのOSは、当初、Raspbianを使用していたのですが、少しでも軽快な動作を期待して、Arch Linuxに切り替えています。

必要なパッケージを導入し、実際に使用する環境にした場合、本当にArch Linuxの方が軽快なのか? 感覚的にはあまり実感できていません。

Raspbianで再セットアップして比較してみたいとも思いますが、現在はArch Linuxです。

久しぶりに、Raspberry Piの公式サイトに行ってみると、ダウンロードページにArch Linuxがありませんでした。 なぜでしょう。

Raspberry Pi Model B

Raspberry Pi Model B

Arch Linuxの初期設定

システムを最新の状態にアップデート
pacman -Syu

sudo をインストール
pacman -S sudo

php apach をインストール
pacman -Sy apache apache php php-apache

設定ファイル(/etc/httpd/conf/httpd.conf)の修正
phpモジュールを追加

LoadModule php5_module modules/libphp5.so
Includeリストの最後に追加
Include conf/extra/php5_module.conf
追加
AddHandler php5-script php
文字コードの設定
AddDefaultCharset UTF-8
置き換える
LoadModule mpm_event_module modules/mod_mpm_event.so
から
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
に変更

php.iniの変更
ファイルの読み込み制限を解除

open_baseidr [制限パス]
から
open_basedir none
に変更
WiFi 関係のパッケージをインストール
pacman -S iw wpa_supplicant wpa_actiond dialog
WiFi toolをインストール (iwconfig等)
pacman -S wireless_tools
ホスト名を設定
hostnamectl set-hostname rasberrypi
再起動
reboot
ワイヤレスLAN を見つけて設定してくれる wifi-menu を使って設定
wifi-menu wlan0
自動で wlan0 が接続されるように設定
systemctl enable netctl-auto@wlan0

ワイヤレスLANの品質表示
cat /proc/net/wireless

固定IPの設定
/etc/netctl/examples/ethernet-staticを/etc/netctlにコピーして編集

IP=static
Address=(‘192.168.0.XX/24′)
Gateway=’192.168.0.XX’
DNS=(‘192.168.0.XX’)
※wlan0も同様
タイムゾーンの設定
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

Webminのインストールと設定
pacmanでwebminパッケージをインストール

sudo pacman -S webmin
制御用端末のアクセス制限解除
sudo nano /etc/webmin/miniserv.conf
allow=127.0.0.1 192.168.0.0/24   追加
webmin自動起動設定とスタート
sudo systemctl enable webmin.sevice
sudo systemctl start webmin.service

MJPG-Streamerのインストール
必要なパッケージを導入

sudo pacman -S base-devel abs file
sudo pacman -S mjpg-streamer
起動コマンド(例)
mjpg_streamer -i “input_uvc.so -d /dev/video0 -r 320×240 -f 12 -y” -o “output_http.so -w /usr/share/mjpeg-streamer/www -p 8080”

I2C ツールのインストール
pacman -S i2c-tools

/etc/modules-load.d/rasberrypi.confへ以下を追加
i2c-dev

servoblasterのインストール
git clone https://github.com/richardghirst/PiBits.git
cd PiBits/ServoBlaster/user/
make servod
起動コマンド
/root/PiBits/ServoBlaster/user/servod –idle-timeout=2000

Wiring Piのインストール
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

webiopiのインストール
cd /tmp/
wget https://aur.archlinux.org/packages/py/python-webiopi/python-webiopi.tar.gz
tar -xvf *.tar.gz
cd python-webiopi
makepkg -s –asroot
pacman -U python-webiopi-0.7.0-1-armv6h.pkg.tar.xz

webiopiの起動
systemctl start webiopi

システム起動時にwebiopiを起動
systemctl enable webiopi
systemctl start webiopi.service

RAMディスクの設定・マウント
sudo mkdir -p /media/ramdisk
sudo mount -t tmpfs -o size=1K tmpfs /media/ramdisk
アンマウント
sudo umount /media/ramdisk
RAMdisk領域への書き込み例
fp = fopen(“/media/ramdisk/test.txt”, “w”);
fputs(s, fp);
RAMdisk領域からの読み込み例
fp = fopen(“/media/ramdisk/test.txt”, “rb”);
s[i] = fgetc(fp);

 

参考にさせていただいたサイト

橋本商会 – Raspberry Pi + mjpg-streamerでwebcam動画配信

人と技術のマッシュアップ – Raspberry PiでGPIO制御

Raspberry Pi 日記 – Raspberry Pi 日記 (part2)

自宅LAN構築の宇宙(せかい) – Arch Linux サーバー構築編