前回、ロボットの筐体を3D CADでスケッチし、プリンターで印刷するところまで進めました。↓
今回はいよいよ最終段階、印刷したボディ内部に基板やサーボモータを収納し、配線作業に入ります。
配線が終われば、ロボットを組立て、プログラムを入れて動作確認までやってみます。
ではまず、基板の収納と配線作業から。
目次
基板の収納と配線
基板、サーボモータの収納
サーボモーターを収納、うまく収まってくれて一安心。
TinyPicoとPCA9685。
こちらも良い感じで収まっています。
PCA9685のピンソケットは配線の際に場所を取るので、全て外しました。またコンデンサの足を延長して寝かせています。
しかしTinyPico、小さい!これでESP32同等の機能を持ってるのが素敵すぎる。
では、地獄の配線作業にとりかかります。。。
配線
TinyPico – i2c – PCA9685 – サーボモータ のような感じで配線を施していきます。
ソケットを抜いたので、半田で直付けになるのが大変でした。せめて温度調整できる半田こてがあればまだ楽だったのですが、いかんせんコーナンで買ったどでかい一本ものの温度調整もなにもないただの半田こてしかなかったもので(-_-;)。。こても買いたいんだけど、高いんだよね。。
ってことで配線終了!続いてプログラムを書き込みます。
プログラム
Tiny Pico側(micropython)
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 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network from machine import Pin, I2C import pca9685 import servo import _thread p = 90 i = 95 n = 93 t = 80 a = 105 b = 85 x = 90 z = 95 i2c = I2C(0, scl=Pin(22), sda=Pin(21)) sev = servo.Servos(i2c) p0 = Pin(19, Pin.OUT) p1 = Pin(23, Pin.OUT) HOST = "TinyPicoのIP" PORT = ポート番号 wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('SSID', 'PASS') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) s = socket(AF_INET, SOCK_DGRAM) s.bind((HOST, PORT)) print("bind") msg = "nane" def recieve(): while(True): global msg msg = s.recv(64) msg = msg.decode() print(msg) time.sleep(0.01) _thread.start_new_thread(recieve, ()) while(True): if msg =="F": while(n <= 133): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) n = n + 1 a = a + 1 b = b + 1 if t <= 95: t = t + 1 while(i >= 55): sev.position(3, i) time.sleep(0.005) i = i - 1 while(n >= 93): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) n = n - 1 a = a - 1 b = b - 1 if t >= 80: t = t - 1 while(i <= 95): sev.position(3, i) time.sleep(0.005) i = i + 1 while(t >= 40): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) t = t - 1 a = a - 1 b = b - 1 if n >= 78: n = n - 1 while(p <= 130): sev.position(1, p) time.sleep(0.005) p = p + 1 while(t <= 80): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) t = t + 1 a = a + 1 b = b + 1 if n <= 93: n = n + 1 while(p >= 90): sev.position(1, p) time.sleep(0.005) p = p - 1 elif msg == "B": while(n <= 133): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) n = n + 1 a = a + 1 b = b + 1 if t <= 95: t = t + 1 while(i <= 135): sev.position(3, i) time.sleep(0.005) i = i + 1 while(n >= 93): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) n = n - 1 a = a - 1 b = b - 1 if t >= 80: t = t - 1 while(i >= 95): sev.position(3, i) time.sleep(0.005) i = i - 1 while(t >= 40): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) t = t - 1 a = a - 1 b = b - 1 if n >= 78: n = n - 1 while(p >= 50): sev.position(1, p) time.sleep(0.005) p = p - 1 while(t <= 80): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) t = t + 1 a = a + 1 b = b + 1 if n <= 93: n = n + 1 while(p <= 90): sev.position(1, p) time.sleep(0.005) p = p + 1 elif msg == "L": while(t >= 40): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) t = t - 1 a = a + 1 b = b + 1 if n >= 78: n = n - 1 while(p >= 50): sev.position(1, p) time.sleep(0.005) p = p - 1 while(t <= 80): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) t = t + 1 a = a - 1 b = b - 1 if n <= 93: n = n + 1 while(p <= 90): sev.position(1, p) time.sleep(0.005) p = p + 1 elif msg == "R": while(n <= 133): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) n = n + 1 a = a - 1 b = b - 1 if t <= 95: t = t + 1 while(i <= 135): sev.position(3, i) time.sleep(0.005) i = i + 1 while(n >= 93): sev.position(5, t) sev.position(4, n) sev.position(0, a) sev.position(2, b) time.sleep(0.005) n = n - 1 a = a + 1 b = b + 1 if t >= 80: t = t - 1 while(i >= 95): sev.position(3, i) time.sleep(0.005) i = i - 1 elif msg == "on": p0.on() p1.on() elif msg == "off": p0.off() p1.off() time.sleep(0.01) |
PCA9685関連のライブラリは別途WEBからDLして、TinyPicoのフラッシュに書き込んでいます。
UDPでM5Stackと通信しています。
特筆する点は、「UDPのデータ受信」と「サーボ駆動」を並列で処理している所です。
ここを1つにまとめてしまうと、処理がおっつかなくなって意図する動作になりません。
M5Stack CORE2側(micropython)
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 |
from m5stack_ui import * from socket import socket, AF_INET, SOCK_DGRAM import time import network from m5stack import * #from m5stack import lcd from machine import Pin from uiflow import * screen = M5Screen() screen.clean_screen() screen.set_screen_bg_color(0xFFFFFF) dstip = "TinyPicoのIP" dstport = ポート番号 wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('SSID', 'PASS') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) print('network config:', wlan.ifconfig()) s = socket(AF_INET, SOCK_DGRAM) #s.bind((dstip, dstport)) touch_button0 = M5Btn(text='Button', x=110, y=10, w=100, h=80, bg_c=0xFFFFFF, text_c=0x000000, font=FONT_MONT_14, parent=None) touch_button1 = M5Btn(text='Button', x=10, y=80, w=100, h=80, bg_c=0xFFFFFF, text_c=0x000000, font=FONT_MONT_14, parent=None) touch_button2 = M5Btn(text='Button', x=210, y=80, w=100, h=80, bg_c=0xFFFFFF, text_c=0x000000, font=FONT_MONT_14, parent=None) touch_button3 = M5Btn(text='Button', x=110, y=150, w=100, h=80, bg_c=0xFFFFFF, text_c=0x000000, font=FONT_MONT_14, parent=None) touch_button4 = M5Btn(text='Button', x=116, y=100, w=40, h=40, bg_c=0xFFFFFF, text_c=0x000000, font=FONT_MONT_14, parent=None) touch_button5 = M5Btn(text='Button', x=165, y=100, w=40, h=40, bg_c=0xFFFFFF, text_c=0x000000, font=FONT_MONT_14, parent=None) def touch_button0_pressed(): global data data = "F" def touch_button3_pressed(): global data data = "B" def touch_button1_pressed(): global data data = "L" def touch_button2_pressed(): global data data = "R" #touch_button0.pressed(touch_button0_pressed) # ボタン"A" が「離された」時の処理 def touch_button0_released(): global data data = "S" def touch_button4_pressed(): global data data = "on" def touch_button5_pressed(): global data data = "off" #data = touch_button0.released(touch_button0_released) data = "nane" stamp = 0 while(True): #global data touch_button0.pressed(touch_button0_pressed) touch_button1.pressed(touch_button1_pressed) touch_button2.pressed(touch_button2_pressed) touch_button3.pressed(touch_button3_pressed) touch_button4.pressed(touch_button4_pressed) touch_button5.pressed(touch_button5_pressed) #data = "A" touch_button0.released(touch_button0_released) touch_button1.released(touch_button0_released) touch_button2.released(touch_button0_released) touch_button3.released(touch_button0_released) s.sendto(data, (dstip, dstport)) print(data) #print(Slider2.get_value()) time.sleep(0.1) |
ボタン操作のプログラムはUIFlowを使いました。
設置したボタン毎に値を振り分け、TinyPico側で値に応じた動作をするようにしています。
また、ボタンを押し続けている間はその動作をし続けるようにしています。(あ、これはTinyPico側か。)
完成組立て
さあ組みあがりました!
手乗りサイズロボの完成(仮)です。
早速動作確認をしてみます。
動作確認
中々いいんじゃないでしょうか。個人的には上出来でございます。
これでほぼ完成でございますが、目を光らせたいので、次回その部分を追加して、終わりとしたいと思います。