RaspberryPi3で作るラジコン

  • 7
    いいね
  • 3
    コメント

RaspberryPi3で作るラジコン
今更ながらラジコンを作ってみたのでその過程とか

目標とか仕様とか

リモート操作で前進、後退、転回が出来るところまで
転回は左右の動力に別々のDCモーターを使用し正転と逆転をし実現する
なので車体はタンク型
なるべくシンプルに作る

集めたもの

Amazonと秋葉原で集めました
(記録をとってないので大分曖昧です)

Raspberry Pi 3 Model B


Eleduino Raspberry Pi 3 Model B アクリル ケース ブラック Black


これはただの飾り


Anker PowerLine Micro USB ケーブル【高耐久ケブラー繊維】 急速充電 高速データ転送対応 数千回以上の折り曲げテスト Samsung、Nexus, LG、 Motorola、 Android スマートフォン他対応


最大2.5Aの電源供給が必要なので百均のだとNG。なので急速充電に対応と書かれたケーブルじゃないとダメ


【Amazon.co.jp限定】Transcend microSDHCカード 32GB Class10


RaspberryPi3には記憶媒体がないので必須。16GBでもよかった模様


Anker 24W 2ポート USB急速充電器 iPhone 6s, 6s Plus/iPad Pro, Air, mini/iPod touch/Nexus/Xperia/GALAXY 他対応 【PowerIQ & VoltageBoost 折畳式プラグ搭載】


RaspberryPi3は最大2.5Aの電源を使うので0.1A足りませんが1.0Aでも動きます。USBに色々刺したりフルで使用すると2.5A必要とのこと


(パワーアド)Poweradd Pilot 2GS 10000mAhモバイルバッテリー 大容量 スマホ急速充電器 2USBポート iPhone / iPod / iPad / Xperia / Nexus / Sony 等対応


1.0A供給をモーターの電源に2.4A供給をRaspberryPi3の電源に


タミヤ 楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168)


モーターが左右二つ付いているのでこれで転回を実現する


タミヤ 楽しい工作シリーズ No.100 トラック&ホイールセット (70100)


キャタピラがダルダルですぐ外れるのが難点


タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)


穴が空いた板


モータードライバー TA7291P 2個セット


DCモーターを正転・逆転・ストップ・ブレーキの 4 モード操作できるらしい


uxcell 炭素皮膜抵抗 カーボン抵抗器 酸金抵抗 250V 10KΩ 1/4W 許容差5% 100個セット


ショートさせないため


5pcs SY-170 ミニブレッドボード カラフルブレッドボード [並行輸入品]


はんだが面倒になったらブレッドボードにさして終わりにするつもりだったのでなるべく小さいのを選んだ


Aukru 3本セット ブレッドボード・ジャンパーワイヤー ジャンパー線 / ケーブル オス-オス/ オス-メス/ メス-メス Arduino Raspberry pi 用


オス-オスとオス-メスが数本あればいい


サンハヤト 小型ユニバーサル基板 ICB-288G


小さいのでいい


白光 半田ゴテ レッド 40W No.502


30WでもOK


goot 高密度集積基板用はんだ SD-60


融点が低温の精密用が使いやすい


タミヤ クラフトツールシリーズ No.104 ベーシックヤスリセット (細目 ダブルカット) 74104


車体のバリ取りに使った

RaspberryPi3のセットアップ

ググったら解決するので割愛

https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=raspbian+raspberry+pi+3

Xwindowsを使いたかったのでRASPBIAN JESSIE WITH PIXELをインストールした

  • DLするのにすごい時間かかったぞめんどくさい
  • DLしたらshasumは必ずやる

ブレッドボードにさしてテスト

配線図はこんな感じ


実際の写真

モータードライバーの説明

販売元ページをみればいいけど少しだけ抜粋

http://toshiba.semicon-storage.com/jp/product/linear/motordriver/detail.TA7291P.html

簡単に説明をするとIN1(ピン番号5)に電圧を掛けるとCW(正転)/CCW(逆転)になり、IN2(ピン番号6)に電圧を掛けるとCCW(逆転)/CW(正転)になるらしい
また、IN1とIN2に電圧を掛けるとブレーキになるらしい

なのでRaspberryPi3側に刺した4、17と9、11から電圧を掛けるよう命令してあげたら、それぞれのOUT1と2に接続したモーターがなんらかのアクションをしてくれるそうだ

ふむふむ

で、テストしたらさっくり動いた

$ echo 4 > /sys/class/gpio/export
$ echo 17 > /sys/class/gpio/export
$ echo 9 > /sys/class/gpio/export
$ echo 11 > /sys/class/gpio/export

$ echo out > /sys/class/gpio/gpio4/direction
$ echo out > /sys/class/gpio/gpio17/direction
$ echo out > /sys/class/gpio/gpio9/direction
$ echo out > /sys/class/gpio/gpio11/direction

# 右後退
$ echo 1 > /sys/class/gpio/gpio4/value
$ echo 0 > /sys/class/gpio/gpio4/value

# 右前進
$ echo 1 > /sys/class/gpio/gpio17/value
$ echo 0 > /sys/class/gpio/gpio17/value

# 左前進
$ echo 1 > /sys/class/gpio/gpio9/value
$ echo 0 > /sys/class/gpio/gpio9/value

# 右後退
$ echo 1 > /sys/class/gpio/gpio11/value
$ echo 0 > /sys/class/gpio/gpio11/value

$ echo 4 > /sys/class/gpio/unexport
$ echo 17 > /sys/class/gpio/unexport
$ echo 9 > /sys/class/gpio/unexport
$ echo 11 > /sys/class/gpio/unexport

Webブラウザから動くようにする

  • webiopiのインストール

http://webiopi.trouch.com/INSTALL.html

  • パッチを当てないとRaspberryPi3で動かないのでありがたくパッチを使わせていただく

https://github.com/doublebind/raspi

  • Webページの用意
index.html
<script src="/webiopi.js"></script>
<script>
function init() {
}
function stop() {
    webiopi().callMacro("stop");
}
function forward() {
    webiopi().callMacro("forward");
}
function reverse() {
    webiopi().callMacro("reverse");
}
function turnLeft() {
    webiopi().callMacro("turnLeft");
}
function turnRight() {
    webiopi().callMacro("turnRight");
}
webiopi().ready(init);
</script>

<script src="https://use.fontawesome.com/6497e53239.js"></script>
<p>
    <i class="fa fa-fw fa-5x" aria-hidden="true"></i>
    <i class="fa fa-arrow-circle-o-up fa-fw fa-5x" aria-hidden="true" onmousedown="forward()"></i>
    <i class="fa fa-fw fa-5x" aria-hidden="true"></i>
</p>
<p>
    <i class="fa fa-arrow-circle-o-left fa-fw fa-5x" aria-hidden="true" onmousedown="turnLeft()"></i>
    <i class="fa fa-stop-circle-o fa-fw fa-5x" aria-hidden="true" onmousedown="stop()"></i>
    <i class="fa fa-arrow-circle-o-right fa-fw fa-5x" aria-hidden="true" onmousedown="turnRight()"></i>
</p>
<p>
    <i class="fa fa-fw fa-5x" aria-hidden="true"></i>
    <i class="fa fa-arrow-circle-o-down fa-fw fa-5x" aria-hidden="true" onmousedown="reverse()"></i>
    <i class="fa fa-fw fa-5x" aria-hidden="true"></i>
</p>

Webページ側のリクエストをpythonで処理

rc.py
import webiopi
GPIO = webiopi.GPIO

leftMotorDrivePWM1 = 4
leftMotorDrivePWM2 = 17
rightMotorDrivePWM1 = 11
rightMotorDrivePWM2 = 9

def setup():
    webiopi.debug("setup")

    GPIO.setFunction(leftMotorDrivePWM1, GPIO.PWM)
    GPIO.setFunction(leftMotorDrivePWM2, GPIO.PWM)
    GPIO.setFunction(rightMotorDrivePWM1, GPIO.PWM)
    GPIO.setFunction(rightMotorDrivePWM2, GPIO.PWM)

@webiopi.macro
def forward():
    webiopi.debug("forward")

    GPIO.pwmWrite(leftMotorDrivePWM1, GPIO.LOW)
    GPIO.pwmWrite(leftMotorDrivePWM2, GPIO.HIGH)
    GPIO.pwmWrite(rightMotorDrivePWM1, GPIO.LOW)
    GPIO.pwmWrite(rightMotorDrivePWM2, GPIO.HIGH)

@webiopi.macro
def reverse():
    webiopi.debug("reverse")

    GPIO.pwmWrite(leftMotorDrivePWM1, GPIO.HIGH)
    GPIO.pwmWrite(leftMotorDrivePWM2, GPIO.LOW)
    GPIO.pwmWrite(rightMotorDrivePWM1, GPIO.HIGH)
    GPIO.pwmWrite(rightMotorDrivePWM2, GPIO.LOW)

@webiopi.macro
def turnLeft():
    webiopi.debug("turnLeft")

    GPIO.pwmWrite(leftMotorDrivePWM1, GPIO.LOW)
    GPIO.pwmWrite(leftMotorDrivePWM2, GPIO.HIGH)
    GPIO.pwmWrite(rightMotorDrivePWM1, GPIO.HIGH)
    GPIO.pwmWrite(rightMotorDrivePWM2, GPIO.LOW)

@webiopi.macro
def turnRight():
    webiopi.debug("turnRight")

    GPIO.pwmWrite(leftMotorDrivePWM1, GPIO.HIGH)
    GPIO.pwmWrite(leftMotorDrivePWM2, GPIO.LOW)
    GPIO.pwmWrite(rightMotorDrivePWM1, GPIO.LOW)
    GPIO.pwmWrite(rightMotorDrivePWM2, GPIO.HIGH)

@webiopi.macro
def stop():
    webiopi.debug("stop")

    GPIO.pwmWrite(leftMotorDrivePWM1, GPIO.LOW)
    GPIO.pwmWrite(leftMotorDrivePWM2, GPIO.LOW)
    GPIO.pwmWrite(rightMotorDrivePWM1, GPIO.LOW)
    GPIO.pwmWrite(rightMotorDrivePWM2, GPIO.LOW)

動いているところ

lzLdGh.gif

https://www.youtube.com/embed/fMwlQ8Kx8zs

感想

動かすまでがすごく大変
これに何時間使ったんだろう。。。

困ったこと

  • WiMAXのせいなのかSSH接続が遅かったり反応が悪かったりするイライラする
  • MACのキーボードの配列を正しく認識してくれなかったのでvimとかで開くとescボタンがどこ?状態で閉じれなかった
  • WebIOPiを立ち上げるとCPU使用率が異常に高くなるなんだこれ
  • モーターに負荷がかかるとRaspberryPi3の電源が落ちる(電源は別にした方がいい)

次回は

PS4のコントローラーで操作できるようにしたいと思ってます