目次
ADRPTB8Cでロボット開発にチャレンジ!!
こんにちは。
AI coordinatorの清水秀樹です。
ついにAI coordinator初のロボット基盤が完成?しました。
我ながらよく作ったと自分で自分を褒めたいですね。
ADRPTB8Cを活用したことで、面倒なはんだ付け等、一切使用しないでロボットアーム付きのロボットを構築できました。
全てpythonで制御できるように開発しています。(そりゃそうだ)
ADRPTB8Cを活用することで、ラズパイ初心者でも割と簡単にキャタピラ&ロボットアーム付きロボットを作成することができます。
今回は、このADRPTB8Cを使ったロボット基盤の開発方法を紹介したいと思います。
初心者の方でも作成できるように紹介しますので、興味がある方はぜひチャレンジしてみてください。
ADRPTB8Cの準備
何はともあれ、ADRPTB8Cがないと始まりません。
まずはこちらを購入しましょう。
ADRPTB8Cはラズパイと2階建ができる基盤になります。
配線もスッキリできるのでオススメですね。
筆者はブレッドボードを使った配線は練習には便利だと考えていますが、ロボットに搭載するには美しくないと思っていましたので、ちょうど良い基盤が見つかって満足しています。
ADRPTB8Cの詳しい商品説明は公式サイトを参考にしてください。
ただ、こちらで紹介している製品の使い方については、筆者のような素人には正直難しいかと思います。
公式サイトでは、NODE-REDを使用した使い方を紹介していますので、クラウドサービスに慣れていない方には少しハードルが高いかと思います。
単純に上記動画のようにDCモーターとサーボモーターを動かすだけなら、NODE-REDを使用する必要はありません。
クラウドサービスを使ったアプリ開発は後々チャレンジして行けば良いかと思います。
環境準備
ADRPTB8Cをラズパイに2階建として搭載すれば、すぐにでも使えるようになるという訳ではございません。
当然ながら環境準備が必要になります。
備忘録の意味も含めて、順を追って説明していきます。
I2C設定
まずはラズパイ本体側の設定から始めましょう。
ラズパイの設定画面でI2Cを有効にします。
以上です。
I2Cとはなんぞやと思う方は、ググってみてください。
色々なサイトで紹介があります。
ADRPTB8Cのセットアップ
ラズパイのI2C接続を有効にしたら、次はADRPTB8Cの環境準備です。
ADRPTB8CでDCモーターやサーボモーターを動かすには、Adafruit_Python_PCA9685ライブラリー等が必要になります。
以下のコマンドでダウンロードどインストールを実行しましょう。
1 2 3 4 5 6 7 |
$ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git $ cd Adafruit_Python_PCA9685 $ sudo python setup.py install $ git clone https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library.git $ cd Adafruit-Motor-HAT-Python-Library $ sudo python setup.py install |
色々インストールしたので、上記だけで動くか不明ですが、もしライブラリーが不足してエラーが出る方がいらっしゃったら連絡ください。
DCモーターとサーボモーターを接続
画像は公式サイトから拝借しています。
実はDCモーターを接続するときに、モーターケーブルを上記画像の白い物体にどうやって差し込めば良いかわからず30分ぐらい格闘していました。
結果的に、単純に爪の部分を押し込んでケーブルを差し込むだけで取り付けられました。
壊れそうでも思い切ってマイナスドライバーかなんかで爪を押し込んでみましょう。
スコッとケーブルが差し込めるはずです。
サーボモーターは3ピンですので、そのまま差し込めば良いかと思います。
I2Cアドレスの確認
I2C接続が成功しているかどうかを確認するには、ポートの動作確認で確認します。
1 2 3 4 5 6 7 8 9 10 11 |
pi@raspberrypi:~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- pi@raspberrypi:~ $ |
上記のように表示されていれば問題ありません。
正直なところ意味はよくわかりませんが、アドレス60、70で接続しているという意味らしいです。
プログラミングする際に、このアドレスが必要になりますので覚えておきましょう。
pythonソースコード
筆者が作成したロボットは、DCモーター2つとサーボモーター4つになります。
それを動かせるソースコードをサクッと作ってみました。
ターミナルから文字を打ち込んで動く仕組みでソースを作成しています。
ただの動作確認用ソースなので悪しからず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
#!/usr/bin/python from Adafruit_MotorHAT import Adafruit_MotorHAT import time import atexit import Adafruit_PCA9685 # create a default object, no changes to I2C address or frequency mh = Adafruit_MotorHAT(addr=0x60) myMotor1 = mh.getMotor(1) myMotor2 = mh.getMotor(2) # servo pwm = Adafruit_PCA9685.PCA9685(address=0x60) pwm.set_pwm_freq(60) def move(degree_1,degree_2,degree_3,degree_8): degree_1 = int(degree_1 * 5.27) degree_2 = int(degree_2 * 5.27) degree_3 = int(degree_3 * 5.27) degree_8 = int(degree_8 * 5.27) pwm.set_pwm(0, 0, degree_1) pwm.set_pwm(1, 0, degree_2) pwm.set_pwm(2, 0, degree_3) pwm.set_pwm(7, 0, degree_8) while (True): command = raw_input() if command == 'f': print "Forward! " myMotor1.run(Adafruit_MotorHAT.FORWARD) myMotor2.run(Adafruit_MotorHAT.FORWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1.5) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1.0) elif command == 'b': print "Backward! " myMotor1.run(Adafruit_MotorHAT.BACKWARD) myMotor2.run(Adafruit_MotorHAT.BACKWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1.5) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1.0) elif command == 'r': print "Backward! " myMotor1.run(Adafruit_MotorHAT.FORWARD) myMotor2.run(Adafruit_MotorHAT.BACKWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1.5) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1.0) elif command == 'l': print "Backward! " myMotor1.run(Adafruit_MotorHAT.BACKWARD) myMotor2.run(Adafruit_MotorHAT.FORWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1.5) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1.0) elif command == '1': move(65,0,0,0) time.sleep(1) move(95,0,0,0) time.sleep(1.0) elif command == '2': move(0,90,0,0) time.sleep(1) move(0,65,0,0) time.sleep(1.0) elif command == '3': move(0,0,90,0) time.sleep(1) move(0,0,55,0) time.sleep(1.0) elif command == '8': move(0,0,0,35) time.sleep(1) move(0,0,0,90) time.sleep(1.0) move(0,0,0,60) time.sleep(1.0) elif command == '0': move(65,90,55,0) time.sleep(1) elif command == 'all': print "Forward! " myMotor1.run(Adafruit_MotorHAT.FORWARD) myMotor2.run(Adafruit_MotorHAT.FORWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1) print "Backward! " myMotor1.run(Adafruit_MotorHAT.BACKWARD) myMotor2.run(Adafruit_MotorHAT.BACKWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1) print "Backward! " myMotor1.run(Adafruit_MotorHAT.FORWARD) myMotor2.run(Adafruit_MotorHAT.BACKWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1) print "Backward! " myMotor1.run(Adafruit_MotorHAT.BACKWARD) myMotor2.run(Adafruit_MotorHAT.FORWARD) myMotor1.setSpeed(255) myMotor2.setSpeed(255) time.sleep(1) print "Release" myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) time.sleep(1) move(95,0,0,0) time.sleep(0.5) move(0,90,0,0) time.sleep(0.5) move(0,65,0,0) time.sleep(0.5) move(0,0,90,0) time.sleep(0.5) move(0,0,55,0) time.sleep(0.5) move(0,0,0,35) time.sleep(0.5) move(0,0,0,90) time.sleep(0.5) move(0,0,0,60) time.sleep(0.5) move(65,90,55,0) time.sleep(0.5) |
今後の発展について
とりあえずロボット基盤は出来上がったので、これで本格的にAIを搭載したロボット開発の着手が可能となりました。
色々なセンサーとAIを組み合わせて、AI coordinator独自のロボット開発を進めていきたいと思います。
それではまた。

こんにちは。ラズパイに興味を持ってこちらに行き着きました。ものすごく学習させていただいています。
今まったく同じようなものを作って見ようと思い、部品購入を検討していたのですがカメラまわりがわかりません。
どこのカメラですか?カメラを動かしてるのはサーボモータですか?ロボットの部分の詳細な記事を作ってもらえると助かります。
このサイトの繁栄のためにアフェに協力させていただきます。
タニシさん。
こんにちは。
ロボットの部品周りの記事は近いうちに作成しますので、参考にして頂ければと思います。
カメラはアマゾンで適当なUSBカメラを購入しました。
動かしているのもサーボモーター です。
よろしくお願い致します。
SHIMIZUさん。お返事ありがとうございます。
記事楽しみにしております。