ソコン関連 ラズパイPicoW で旋風機を操作(その2、完成!)
RaspberryPi PicowのWiFiをAP-Modeにして接続し、ブラウザからコントロールできた。スマホを機内モードにしてAPに接続すれば良い、手順は簡単。色々検索してソースコードを拾い集めて、数値を試行錯誤すれば、出来上がり。下の画像がスマホの操作画面、停止はPWMのduty比を設定して回転を停止させるもの、緊急停止はPicowのソフトリセット。まぁ、気休めかな。こっちはハードウェア。分解したドローンにサーボ、ESCは付いていたので、それらをPWMでコントロールするようにしただけ。ESCは起動時にduty比を小さくしておかなければならないのだけれど、picowが立ち上がる方が早くて、問題なかった。右下のボードから5Vを供給している。ESCには6sそのままなので22.4v。デルタスリーヒンヂ装備のローターだけど意味なし。実機はガバナーで回転数一定だったけれど、こいつは回転数もローターピッチも変化させている、じゃぁ固定ピッチでいいじゃないという突っ込みは無しで。以下はソースリスト===ここから## 旋風機コントロールアプリ for Picow v0.1 APMode ⇒ ok# v0.2 Bottun&Disp. ⇒ ok# v0.3 Batt.& SERVO ⇒ ok# v1.0 UIimport timeimport networkimport socketimport machinefrom machine import PWMled = machine.Pin("LED", machine.Pin.OUT)dispState = 'Status Unknown'# GPIO の設定step_SERVO = 0step_ESC = 0duty_SERVO = 33161 # 65535 の50.6% 1%増減では655duty_ESC = 5898 # 65535 の9%、0.5%増減では328pwm_SERVO = PWM(0, freq=333, duty_u16=duty_SERVO)pwm_ESC = PWM(7, freq=100, duty_u16=duty_ESC)# サーボの設定 周波数は333Hz ⇒ 3003μs、中立1520μsの時はduty比=1520/3003=50.6%# ESC の設定 周波数は100Hzと仮定 ⇒ 10,000μs、900μsの時はduty比=900/10000=9%# PicoWのSSIDとパスワードを入力ssid = 'Raspi-PicoW'password = '********'# クライアント表示のHTMLhtml = """<!DOCTYPE html><html><head> <meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="data:,"> <style> html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;} .buttonGreen { background-color: #4CAF50; border: 2px solid #000000;; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; } .buttonRed { background-color: #D11D53; border: 2px solid #000000;; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 32px; margin: 4px 2px; cursor: pointer; }text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;} </style></head><body> <center><h1>Raspberry Pi Pico W</h1></center><br><br> <form> <center> <button class="buttonRed" name="machine" value="stop" type="submit">緊急停止</button></center> <br><br> <center><button class="buttonGreen" name="ESC" value="stop" type="submit">停止</button></center> <br><br> <center> <button class="buttonGreen" name="SERVO" value="low" type="submit">弱</button> <button class="buttonGreen" name="SERVO" value="mid" type="submit">中</button> <button class="buttonGreen" name="SERVO" value="high" type="submit">強</button></center> </form> <br><br> <br><br> <p>%s<p></body></html>"""# Wi-Fi 接続実行ap = network.WLAN(network.AP_IF)ap.config(essid=ssid, password=password)ap.active(True)while ap.active() == False: passprint('Connection successful')print(ap.ifconfig())# ソケットを開くaddr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]s = socket.socket()# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(addr)s.listen(1)print('listening on', addr)# HTTPリクエスト処理、レスポンス処理while True: try: cl, addr = s.accept() print('client connected from', addr) request = cl.recv(1024) print("request:") print(request) request = str(request) try: request = request.split()[1] except IndexError: pass if request == '/?machine=stop': led.on() time.sleep(0.5) led.off() machine.reset() elif request == '/?ESC=stop': duty_ESC = 5898 duty_SERVO = 33161 elif request == '/?SERVO=low': duty_ESC = 7866 duty_SERVO = 29886 elif request == '/?SERVO=mid': duty_ESC = 8194 duty_SERVO = 29231 elif request == '/?SERVO=high': duty_ESC = 8522 duty_SERVO = 28576 pwm_ESC.duty_u16(duty_ESC) pwm_SERVO.duty_u16(duty_SERVO) ledState = "ESC " + str(duty_ESC) + " : SERVO " + str(duty_SERVO)# Create and send response stateis = ledState response = html % stateis full_response = 'HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n' + response cl.send(full_response) cl.close() except OSError as e: cl.close() print('connection closed')===ここまで楽しかったぁ! 次の遊びを考えよう!