ラズベリーパイ3で遊ぶ kunioのHP
H28.11.14
ラズパイ3でBlynkアプリを使ってIOTぽいことができそうなので遊んでみた。
ラズパイをセットアップして、いわゆるLチカ(LEDの点消灯)まではローカルネット上で簡単にできますが、これを
インターネットを介して行うとすると、一気にハードルが高くなりますがこれを比較的簡単に実現できる無料の
Blynkアプリの存在を知ったので、使ってみました。
Lチカ、ハードSWによるスマホアプリのLチカ、ジョイスティックによるサーボモータ制御までやってみた。
構成
スマホ(Blynk) 〜(au)〜インターネット〜(プロバイダー)〜 無線LAN 〜 ラズパイ3 〜 LED、SW、サーボモータ
ラズパイ3 ハード接続
GPIO17−抵抗(330Ω)−GND
GPIO22−抵抗(330Ω)−GND
3.3V−抵抗(1kΩ)−pushSW−GPIO4・抵抗(1kΩ)−GND
サーボモータ1 赤:5V、黒:GND、白:GPIO18(PWM0)
サーボモータ2 赤:5V、黒:GND、白:GPIO13(PWM1)
Blynkの設定
ボタン1 INPUT:GP17 MODE:SWITCH
ボタン2 INPUT:GP22 MODE:SWITCH
LED INPUT:V2 MODE:SWITCH
Joystick OUTPUT:MERGE V0 AUTO RETURN:ON
ラズパイ3のプログラム
※ラズパイのセットアップ、Blynkのインストール、コンパイル実行方法等は、末記リンク等を参照して下さい。
blynk-library/linux内のmain.cppの修正内容です。
@Lチカ
プログラム追加不要
AハードSW読取、それに連動してスマホ側LEDをONOFF(Lチカの逆)
こちらの情報はネット上に少なかったので、試行錯誤で実現しました
BLYNK_READ()で試みましたが上手くいかなかったので、GPIO4の割り込み
処理(スマホLED制御2)からled_onnoffを読み出しGPIO4のH/Lによりバーチャルピン2に
255(ON)、0(OFF)書き込むことで、LEDが点消灯させる(スマホLED制御1)
Bサーボモータ制御(サーボ:GWS PIC)
ラズパイのハードPWMを活用して、制御信号を作成
PWM周波数 ベース周波数19.2MHz/クロック分周設定/分解能設定
今回50Hz(20ms)=19.2M/375/1024
パルス幅設定計算(ジョイスティック制御1)
PWMカウンタ周期51.2kHz=19.2M/375
今回のサーボ0.75〜2.25ms(センター1.5ms)
51.2kx0.75ms≒38、51.2kx2.25ms≒116(センター 77)
ジョイスティック入力は0−255
換算式 入力値×(116−38)/256+38=入力値×78/256+38=入力値×39/128+38
(main.cppの内容) 赤字が追加部分
//これ以前は変更がないため略、これ以降に
#include
<BlynkWidgets.h>
//コメントアウト
//BLYNK_WRITE(V1)
//{
// printf("Got a value:
%s\n", param[0].asStr());
//}
//ジョイスティック制御1
BLYNK_WRITE(V0) {
int x =
param[0].asInt()*39/128+38;
int y =
param[1].asInt()*39/128+38;
pwmWrite(18, x);//ジョイスティック1のパルス幅設定
pwmWrite(19, y);//ジョイスティック2のパルス幅設定
}
//スマホLED制御1
void
led_onoff(void)
{
if(digitalRead(4) ==
1)
Blynk.virtualWrite(2,255);
else
Blynk.virtualWrite(2,0);
}
int
main(int argc, char* argv[])
{
const char *auth, *serv,
*port;
parse_options(argc, argv, auth, serv,
port);
Blynk.begin(auth, serv, port);
//スマホLED制御2
wiringPiISR(4, INT_EDGE_BOTH,
led_onoff);
//ジョイスティック制御初期化
pinMode(18,
PWM_OUTPUT);//ピンモード設定
pinMode(19, PWM_OUTPUT);//ピンモード設定
pwmSetMode(PWM_MODE_MS);//マークスペースモード(デフォルトはバランスモード)
pwmSetClock(375);//クロック分周設定
pwmSetRange(1024);//分解能設定
while(true)
{
Blynk.run();
}
return
0;
}
実行結果(動画参照)
@Lチカは、レスポンスも良く問題なく動作。
AハードSWよるスマホLチカは、応答に若干遅れはあるがほぼ問題なく反応。
Bジョイステックによるサーボ制御も、応答は問題なし。
ただし、ジョイステックでX−Y2方向同時制御は無理があり、操作がしにくくスティックが円形の移動のため
同時に最大または最小にできない。ラジコンのように分離する方がよい。
ラズパイのPWM波形制御は意外と簡単。ハードPWMは4(2種類(0,1)×2)あるが同じ種類でパルス幅は
変えられないようであったので、今回0と1で分けて使用した。
今度は、サーボ制御を応用してスマホラジコンに挑戦したい。
参考リンク
RaspberryPi電子工作入門
プログラムをしないでも「RaspberryPi」を遠隔操作できるスマホアプリ「Blynk」が凄い!!
Blynk
Raspberry
Piブログ
RaspberryPiとWiringPiでサーボを動かす