TentoBugのアイコン画像
TentoBug 2024年10月30日作成 (2024年11月23日更新)
製作品 製作品 閲覧数 72
TentoBug 2024年10月30日作成 (2024年11月23日更新) 製作品 製作品 閲覧数 72

Pico Wを利用した いまいちな竹とんぼ発射台

はじめに
 IoTを活用した竹とんぼの発射台を作ろうと思って出発しましたが、いまひとつな出来となりました。ローカルな環境ですら、うまくつながらない。飛ぶというより・・・。その記録です。色々と課題が残ってしまいました。
 使い方としましては、パソコンで任意の名前のSSIDに接続して、ブラウザで任意のアドレスに接続します。「26 ON」を押すことで竹トンボが飛ぶ予定でした。
 こうすることで、いまひとつなプログラムや竹とんぼや発射台を安全な位置で眺めることができます。

部品

部品名 型番
メインデバイス Pico-W
反射型フォトセンサ RPR-220
モーター RE-140RA
歯車 小 m=0.5 10歯
歯車 大 m=0.5 50歯

設計図
キャプションを入力できます
実験ではVSYSに3.6V。ダイオードついているからいいのかな。USB接続で、VSCODEでRUNしました。
定格電流などの確認ができていません。

3Dプリンタで印刷します。
キャプションを入力できます
キャプションを入力できます
⑨の羽根の穴に爪(竹)楊枝(φ2ぐらい)を刺して、爪(竹)楊枝の長さを調整します。
キャプションを入力できます
④の歯車にシャフトを付けます。⑤の板をつけます。⑥の円柱をつけます。
⑤の歯車の下にモータをつけます。
キャプションを入力できます

検討
1 次は⑥の部品を開くようにしようと思い図面を作成してみました。飛ぶかな。はめ合いが難しそうなので、竹楊枝にマスキングテープを貼って調整します。
キャプションを入力できます
2 4と5のモータを入れ替えて試します。

ソースコード

不安定版main.py

import sys import network import socket #import machine from machine import Timer from machine import Pin from machine import ADC from utime import sleep_ms from utime import sleep_us lis=[] usec=[30] t0=Timer() t1=Timer() def func(t): ad27=adc.read_u16()/ 65535.0*100.0 if len(lis)>4095: lis.pop(0) lis.append(ad27) sleep_ms(1) def motor(t): g26.value(1) sleep_us(usec[0]*250) g26.value(0) SSID= 'shimako' PASSWORD = 'museum_library' IP = '192.168.4.50' #ピンの設定 g26=Pin(26,Pin.OUT) led = Pin("LED", Pin.OUT) adc = ADC(27) g26.value(0) led.value(1) wlan = network.WLAN(network.AP_IF) sleep_ms(500) wlan.config(ssid=SSID,password=PASSWORD) sleep_ms(500) wlan.active(True) sleep_ms(500) wlan.ifconfig((IP,'255.255.255.0','','8.8.8.8')) #ゲートウェイ、DNSを省略? sleep_ms(500) led.toggle() sleep_ms(500) led.toggle() # IPアドレス設定できたかな? while wlan.status() != network.STAT_GOT_IP: sleep_ms(500) led.toggle() sleep_ms(500) led.toggle() status = wlan.ifconfig() #PICO Wの割り当てられているIPアドレスの表示 print( status[0] ) #ソケットsをアドレスaddrに紐づける addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] #??? sleep_ms(500) led.toggle() s = socket.socket() sleep_ms(500) led.toggle() try: s.bind(addr) #エラー処理が欲しい。 OSError: [Errno 98] EADDRINUSE except OSError as e: if e.errno==98: sleep_ms(100) else: print(e) #led.value(1) #sys.exit(0) except Exception as e: print(e) #led.value(1) #sys.exit(0) #s.settimeout(1.0) sleep_ms(500) led.toggle() s.listen(1) #接続可能数 sleep_ms(500) led.toggle() sleep_ms(500) led.toggle() sleep_ms(500) led.value(0) #5秒後 html1 = """<!DOCTYPE html> <html lang="ja"> <head> <title>モータ制御 0.2</title> <meta charset="UTF-8" /> <meta http-equiv="refresh" content="5; URL="> </head> <body><h1>設定</h1> <form method="GET" action=""> <button type="submit" name="button" value="0">26 ON</button> <button type="submit" name="button" value="1">26 OFF</button> <button type="submit" name="button" value="2">-</button> <button type="submit" name="button" value="3">+</button> </form> <br/> """ html2 = """ </body> </html> """ kaisu=1 #タイマーの初期化 ms t0.init(period=10, callback=func) #t1.init(period=10, callback=motor) #パソコンのブラウザからPICO Wに接続された時の処理 #print("--- wait ---") while True: jyushin="" try: #print("--- p11 ---") cl, addr = s.accept() sleep_ms(100) except OSError as e: #OSError: [Errno 110] ETIMEDOUT print(e.errno) if e.errno!=110: break #s.close try: #print(addr) jyushin=str(cl.recv(256),"utf-8") kaishi=0 kaishi=jyushin.find('button=') if kaishi !=-1: sleep_ms(1) #print(jyushin[kaishi+7:15] #GET /?button=2 HTTP/1.1 if( int(jyushin[kaishi+7:15])==0 ): t1.init(period=5, callback=motor) #10 elif int(jyushin[kaishi+7:15])==1 : t1.deinit() elif int(jyushin[kaishi+7:15])==2 : if usec[0]<=0: usec[0]=0 else: usec[0]-=1 elif int(jyushin[kaishi+7:15])==3 : if usec[0]>=40: usec[0]=40 else: usec[0]+=1 cl_file = cl.makefile('rwb', 0) sleep_ms(1) while True: line = cl_file.readline() if not line or line == b'\r\n': break cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n') cl.send(html1) cl.send(str(usec[0]) + '</br>') cl.send('<svg width="500" height="150"><polyline points="') #x,y for x in range(0,len(lis),1): cl.send( str(x)+ ',' + str(100.0-lis[x])) if x!=len(lis)-1: cl.send(',') cl.send('" fill="none" stroke="black"/></svg>') #for x in range(0,len(lis),1): # cl.send(str(lis[x])+',') # if (x%10)==9: # cl.send('<br>') cl.send(html2) cl.close() kaisu=kaisu+1 lis.clear() sleep_ms(1) except: led.value(1) print('dame dame') sys.exit(0) led.value(1)

参考資料
https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html

1
ログインしてコメントを投稿する