Raspberry Piに何かつないで遊ぼう
オープンソースカンファレンス関西@京都 2013Yasuhiro ISHII
自己紹介•石井 康寛(Yasuhiro ISHII)•組み込み業界でソフト開発してます•出身 : 三重県度会郡度会町•趣味 : 電子工作、ソフト開発、海外旅行、などなど• Twitter : yishii• Facebook : • http://facebook.com/ishiiyasu•ブログ : 日曜エレクトロニクス(日エレ)• http://projectc3.seesaa.net/
RPiと外部機器を繋ぐ
• USBポートに接続する
•ピンヘッダに接続する
RPiと外部機器とを接続方法の内、お手軽なものとして、以下の2つが考えられます。
USBでの接続・USB-WiFi/3Gでネット接続・USB-BTアダプタでBT機器接続・USB WebCamでライブ配信・USB センサー機器でセンシング等
既製or自作USB機器(ArduinoやPICマイコン等で作成出来る)との接続は簡単です。
ピンヘッダでの接続ピンヘッダとは?
RPiのピンヘッダ
R2.0のみ
ピンヘッダのピン機能アサイン
I2C-1
I2C-0SPI
UART
GPIO_GENxはGPIO。赤枠ピンもGPIOとして使用可。
PWMI2S
電源専用ピン(制御に使用できない)
GPIO• GPIO = General Purpose Input/Output(汎用入出力)
• LEDの点灯をしたり、スイッチの入力を読み取ったり出来る
UART• Universal Asynchronous Receiver Transmitter
• 通常1対1の機器間通信に使用
• いわゆるRS-232C。
• USBシリアル変換チップ経由でPCからコンソール操作
• Arduinoと接続して連携
• UART接続タイプのGPSモジュールを接続
• シリアルサーボを接続
SPI• Serial Peripheral Interface
• MISO、MOSI、SCLKに加え、接続対象デバイス数分のSSで接続
• 1対多で通信可能(通信相手数分、SS信号が必要)
RPi
有機EL
EEPROM
NFCデバイス
接続例
I2C• Inter-Integrated Circuit
• 2本の信号線(SCL、SDA)で複数の機器と接続可能
• 1対多接続可能(I2Cバス上で、個々のデバイス毎がユニークな番号(スレーブアドレス)を持つ。
モータードライバモジュール電流・電圧測定
モジュール
LCD
RTC EEPROM
RPi
LCD モータードライバ RTC
スレーブアドレス0x10
スレーブアドレス0x11
スレーブアドレス0x12
I2CマスターI2C対応デバイスの例
実際にRPiを使用して何か機器を作ってみよう!
▶ Raspberry Piでラジコンを作ってあそぼう
ラジコンの構成
I2Cモータードライバ×2
I2Cバス
USB
無線
ワイヤレスキーボード
モーター×2
準備物
タミヤ 楽しい工作シリーズ No.168ダブルギヤボックス (左右独立4速タイプ)882円 @Amazon
ストロベリー・リナックスI2Cモータードライバ・モジュール DRV8830@567円 × 2個http://strawberry-linux.com/catalog/items?code=12030
準備物
タミヤ 楽しい工作シリーズ No.101トラックタイヤセット(36㎜径)TRUCK TIRE SET (36mm DIA.)Item No:70101 組立キット378円(本体価格360円)
タミヤ 楽しい工作シリーズ No.98ユニバーサルプレートセットUNIVERSAL PLATE SETItem No:70098 組立キット378円(本体価格360円)
準備物
線材少しUSBモバイルバッテリー
タミヤ 楽しい工作シリーズ No.144ボールキャスター(2セット入)BALL CASTER (2pcs.)Item No:70144 組立キット378円(本体価格360円)
モータードライバDRV8830(TI)
I2C制御 電源 2.75~6.8V 連続1A出力
秋月電子通商170円
ストロベリーリナックス567円
→今回はストロベリーリナックスのものを使用します
接続概略図
RPiモータドライバ
モータドライバ
I2C1-SCL
I2C1-SDA
・
・
USBコネクタ経由でバッテリーへ
USBケーブル経由でバッテリーへ
接続 実体配線図
VCCSCLSDA
GND
VCCSCLSDA
GND
車体の作成
ハードは完成です
ソフトの構成Linux inputsubsystem
(/dev/input/event0等)
ラジコンメインプログラム
キーイベント
I2Cデバドラ(/dev/i2c-1等)
モータードライバ制御コマンド
I2Cを使用する準備• /etc/modules
• i2c-dev を記載
• /etc/modprobe.d/raspi-blacklist.conf
• blacklist i2c-bcm2708 をコメントアウト
I2Cデバイスドライバのオープン
int fd;
// RPi Rev1.0使用時は /dev/i2c-‐0 fd = open("/dev/i2c-‐1",O_RDWR);
if(fd < 0){ printf("i2c open error\n"); return(-‐1); }
メイン処理(キーイベント取得+モーターへの指令)while(1){ // 標準入力からイベント取り込み read(0,&event,sizeof(event)); if(event.type == EV_KEY && event.value != 0){ switch(event.code){ case KEY_UP: // 左右モーターの前転 motor_l.control(MOTOR_POWER,DRV8830::MOTOR_FORWARD); motor_r.control(MOTOR_POWER,DRV8830::MOTOR_FORWARD); break; case KEY_DOWN: // 左右モーターの後転 motor_l.control(MOTOR_POWER,DRV8830::MOTOR_REVERSE); motor_r.control(MOTOR_POWER,DRV8830::MOTOR_REVERSE); break;
《中略》 }}
モータードライバ制御処理int DRV8830::control(int power,int type){ unsigned char buff[2];
// 制御対象デバイスのスレーブアドレスをセット ioctl(i2c_fd,I2C_SLAVE,i2c_slaveaddr);
// コマンドを組み立ててデータ送出 buff[0] = 0x00; buff[1] = (unsigned char)(power << 2) | (unsigned char)(type & 0x03); write(i2c_fd,buff,2);
https://github.com/yishii/RaspberryPi_Radicon/ソースコード(github)
RPiでのビルド方法$ g++ drv8840.cpp radicon.cpp -o radicon
実行方法$ sudo ./radicon < /dev/input/event0
(event0がキーボードの場合)
実演
太陽電池の充電状態をネットにアップする装置
I2C
USB3Gドングル
その他製作例1
その他製作例2現在地のGoogleMapsやStreetViewを表示する装置
UART
地図データ
ハードウェア制御用のライブラリの使用 1
• bcm2835ライブラリを使用する
• http://www.airspayce.com/mikem/bcm2835/
• Cや各種スクリプト言語(Ruby等)から呼び出し、容易に制御構築可能。
• Arduino APIスタイルに慣れている方には、WiringPiもオススメ• https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
pinMode (0, OUTPUT);
for (;;) { digitalWrite (0, 1); delay (500); digitalWrite (0, 0); delay (500); }
ハードウェア制御用のライブラリの使用 2
ありがとうございました
ブログ : 日曜エレクトロニクス(日エレ)http://projectc3.seesaa.net/
Recommended