【ラズパイPico】ネットワーク機能を実装してみた!! WebClientやHTTPリクエスト(GET/POST)によるAPIの利用が可能です!

Поділитися
Вставка
  • Опубліковано 8 вер 2024
  • ラズパイPicoとCircuitPythonを使ってネットワーク機能を実装してみました。DHCPでのIPアドレス自動取得から始まり、HTTPのWebクライアント機能やGET/POST通信も可能です。これでラズパイPicoをIoTデバイスとして活用することができるようになりました。
    ※MOSI/MISOのMaster/Slave呼称について
    MOSIは一般的にはMaster Out Slave Inの略とされていますが、昨今ではMaster/Slaveという単語が人権上好ましくないと判断される傾向にあります。
    そのため当動画でもMaster/Slaveという言葉を避け、Adafruit社 ( CircuitPython ) での定義に準拠してMicrocontroller/Sensorという単語を使用しています。
    ---
    ■CircuitPython & Wiznet W5500の解説ページ
    learn.adafruit...
    ■CircuitPython(Pico用)のダウンロードページ
    circuitpython....
    ■CircuitPythonライブラリのダウンロードページ
    github.com/ada...
    ■CircuitPython & ラズパイPicoの仕様紹介ページ
    learn.adafruit...
    ■CO2センサー製作動画
    • 【ラズパイ】ラズパイで二酸化炭素濃度測定器を...
    ■Nature Remo
    nature.global/

КОМЕНТАРІ • 25

  • @user-im2pf2pk9t
    @user-im2pf2pk9t 2 роки тому +1

    すばらしい!これで、PICO が使えるものになりました。
    さっそく HTTP で親サーバーと通信するソフトが出来ますね。
    僕は火災警報器を Raspberry PI Zero + ADコンバーター+煙センサーで作って
    いたんですが、PICO でも火災警報器が出来ますね。

    • @Shartick
      @Shartick  2 роки тому

      おお、火災報知器ですか。素晴らしいですね。
      汎用性や使いやすさはZeroに軍配が上がるのですが、アナログ変換が必要なので一長一短なんですよね。
      Picoがようやく安定してネットワーク接続ができるようになったので、使い道がかなり広がりそうです!

  • @essasa
    @essasa 2 роки тому

    picoをもらったので検索な海をさまよい、ここにたどり着きました。ネットワークにつなげるなんて一気に夢が広がってワクワクしてきました。DNS通信してみたいです。

    • @Shartick
      @Shartick  2 роки тому

      コメントありがとうございます。
      Picoがネットワークに繋がるようになれば可能性がかなり広がりますね!
      WiFi接続できれば最高なのですが、こちらはまだ研究中なのでやり方が分かり次第動画にしたいと思います。

  • @gordon3763
    @gordon3763 3 роки тому +2

    めちゃくちゃ勉強になります!pico関連の動画で一番分かりやすいです!
    もし機会があれば自作タッチセンサーの動画も載せてください!日本語の動画がないです>_<
    次回も楽しみにしてます!

    • @Shartick
      @Shartick  3 роки тому

      コメントありがとうございます!!とても嬉しいです。
      今後も仕事が落ち着いたらバンバンPico関連の動画を投稿していきますのでよろしくお願いします!🙇

  • @user-gu3tu8zs8h
    @user-gu3tu8zs8h 3 роки тому +3

    とてもためになりました、面白かったです!ありがとうございました。
    これでセンサーデータをトリガーにした送信、が出来ることが分かりました。
    この逆、親となるマシンがあったとして、そこから指示を受けてpicoのプログラム(関数)を発動させたい場合は、どんな通信が良いのでしょうか。
    つまり受信です。
    これもLANでいけるのでしょうか。
    picoじゃないのかもしれませんが。。
    そしてデスマ、お身体に気をつけてがんばってください

    • @Shartick
      @Shartick  3 роки тому

      こちらこそご視聴、コメントありがとうございます!何とかデスマを生き延びて頑張って次の動画を作ります。
      ご質問いただいた件ですが、
      ①マシン同士で通信する場合、今回取り上げたCircuitPythonのライブラリにはTCP/IPが実装されているので、親マシンとPico間でソケット通信をしてトリガーとするのが順当だと思います。
      micropython-docs-ja.readthedocs.io/ja/latest/esp8266/tutorial/network_tcp.html
      しかし、私はネットワーク周りをがっつり実装した経験がないので具体的にどうすればいいか分かりません。
      ②代替案として、下記ライブラリのページに書いてあるサンプル(2つ目)をベースに実現可能かもしれません。
      github.com/adafruit/Adafruit_CircuitPython_Wiznet5k#usage-example
      これはPicoをWebサーバーとして待ち受けさせて、親マシンから特定のURLにGETリクエストが来た時に発動するものだと思います。通信がHTTPで完結するのである意味シンプルに作れそうです。
      実際に試せていないので上手くいくかは分からないのが申し訳ないのですが…時間が取れたら試してみます!(時間が取れたら…!)

  • @sniffbrown
    @sniffbrown 3 роки тому +1

    こんにちはいつも楽しく拝見させていただいております。
    お手すきになったら、ESP32とPicoを組み合わせてPicoの無線LAN化をお試しいただけないでしょうか?

    • @Shartick
      @Shartick  3 роки тому +1

      いつもご視聴本当にありがとうございます。
      Picoで無線LANはいつか実現したいと思っていますので、うまく行った暁には必ず動画で紹介します!
      (ちょっと調べてみた所、実現できそうな情報が見つかったので近いうちに頑張ってみます)

  • @user-vz6is6te4j
    @user-vz6is6te4j 3 роки тому

    最近ピコも供給が増えてきたみたいですね。
    御一人様200枚までOKになってました。
    買ったのはゼロWですが カリを入れたけどちょっともっさり

    • @Shartick
      @Shartick  3 роки тому

      もう200枚までOKになりましたか!供給安定していつでも手に入りそうですね。よかったです。
      ゼロWもなかなか遊べるのですがデスクトップ的な使い方をするにはちょっと厳しいですよね。工夫のし甲斐があって面白いです。

  • @user-ck7cr6kd7v
    @user-ck7cr6kd7v Рік тому

    ウェアラブル点字デバイスできますか?指点字マシーンですチャットとか通知メッセージを指点字で読み取りたいですeps32を使って指先のモーターを動かして目と耳に障害がある人のために作っていたらけないでしょうか

  • @0xdeadbeef131
    @0xdeadbeef131 3 роки тому +1

    ラズパイでVGA出力やって欲しい

    • @Shartick
      @Shartick  3 роки тому +3

      リクエストありがとうございます。いいですね〜VGA出力!
      確か以前Twitterで試していた人がいたはずなので探してみます!

  • @user-xt8ug6zv5k
    @user-xt8ug6zv5k 3 роки тому

    MISOはMaster In Slave Out だと思います。
    MOSIも

    • @Shartick
      @Shartick  3 роки тому

      一般的にはMaster/Slaveを使いますよね。
      この動画ではCircuitPython内での呼称に準拠してMicrocontroller/Sensorを使用しています(昨今の人権問題への取り組みでしょうね)。
      蛇足になると思い動画内では言及しなかったのですが、紛らわしいので概要欄に追記しておきます。ご指摘ありがとうございます。

    • @user-xt8ug6zv5k
      @user-xt8ug6zv5k 3 роки тому

      @@Shartick
      そうなんですね。
      蛇足でしたねすみません、、

    • @Shartick
      @Shartick  3 роки тому

      いえいえとんでもないです!コメントありがとうございます〜😆

  • @user-bc3lp8yf3j
    @user-bc3lp8yf3j 2 роки тому

    ラズパイpicoのみを購入したのですがmoduleをインストールすることができません。
    ラズパイpicoにrpi.gpioのmoduleを導入することはできますか?
    プログラミングしてみたところno named module error rpi となるので…

    • @Shartick
      @Shartick  2 роки тому +1

      公式のMicroPythonを使っていますか?
      もしよろしければ、動かそうとしているコードを貼っていただければこちらでも動かしてみます!

    • @user-bc3lp8yf3j
      @user-bc3lp8yf3j 2 роки тому

      @@Shartick
      他にも多くの問題はあるかと思いますが、こちらがコードです。環境構築は動画を参考にしております。
      import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
      import time #時間制御用のモジュールをインポート
      import machine #電圧測定用のモジュールをインポート
      import utime #タイムモジュールをインポート
      import reading
      #7segの数字数字に全て関数付けする
      #7セグLED A(7番ピン) :GPIO16 :ジャンパ線 白
      #7セグLED B(6番ピン) :GPIO20 :ジャンパ線 黄
      #7セグLED C(4番ピン) :GPIO19 :ジャンパ線 青
      #7セグLED D(2番ピン) :GPIO27 :ジャンパ線 黄
      #7セグLED E(1番ピン) :GPIO17 :ジャンパ線 白
      #7セグLED F(9番ピン) :GPIO23 :ジャンパ線 オレンジ
      #7セグLED G(10番ピン) :GPIO18 :ジャンパ線 青
      #7セグLED DP(5番ピン) :GPIO26 :ジャンパ線 オレン
      #GPIOの設定
      GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
      GPIO.setup(seg_pin, GPIO.OUT) #GPIO(8ヶ)を出力モードに設定
      seg_pin = [#A, B, C, D, E, F, G, DP
      16, 20, 19, 27, 17, 23, 18, 26] #変数"seg_pin"にリストを格納 ポート番号を変更の際はここを
      seg_0 = [ #A, B, C, D, E, F, DP
      16, 20, 19, 27, 17, 23, 26] #0のために中心のG以外点灯
      seg_1 = [ #B, C, DP
      20, 19, 26]
      seg_2 = [ #A, B, D, E, G, DP
      16, 20, 27, 17, 18, 26]
      seg_3 = [ #A, B, C, D, G, DP
      16, 20, 19, 27, 18,26]
      seg_4 = [ #B, C, F, G, DP
      20, 19, 23, 18, 26]
      seg_5 = [ #A, C, D, F, G, DP
      16, 19, 27, 23, 18, 26]
      seg_6 = [ #A, C, D, E, F, G, DP
      16, 19, 27, 17, 23, 18, 26]
      seg_7 = [ #A, B, C, DP
      16, 20, 19, 26]
      seg_8 = [ #A, B, C, D, E, F, G, DP
      16, 20, 19, 27, 17, 23, 18, 26]
      seg_9 = [ #A, B, C, F, G, DP
      16, 20, 19, 23, 18, 26]
      seg_10 =[ #G, DP
      18, 26] #error判別用の中央点灯
      #sensor_temp = machine.ADC(4)
      sensor_temp = machine.ADC(0) #センサーがADCに接続され、値を読み取れるようにする
      conversion_factor = 3.3 / (65535) #この数式はADCで読み取った値を変換するための計算、ADCが16bitの値で帰ってくるため2の12乗で割っている。3.3VをかけることでADCの読み取り値を0V~3.3Vに対応させている
      while True: #繰り返しさせるための式 繰り返しできない場合はここをfor文にする?
      X = 0 #表示させるためのXの初期化
      O = 8
      P = 4
      Q = 2
      R = 1
      num = 0
      reading = sensor_temp.read_u16() * conversion_factor
      all = sum(all,reading)
      utime.sleep_ms(1) #1ミリ秒の遅延を発生させる


      if N < reading: #読み取った値に平均がNより大きい場合 Nに実数を入力
      X += O #4桁目の正負の判断
      else : #上記の否定(読み取った値がXより小さい場合)
      O = 0 #4桁目の正負の判断
      X += O #XとOを足す、二進数4桁目は8のため

      utime.sleep(1) #1秒の遅延を発生させる

      if N < reading: #読み取った値に平均がNより大きい場合 Nに実数を入力
      X += P #4桁目の正負の判断
      else : #上記の否定(読み取った値がXより小さい場合)
      P = 0 #4桁目の正負の判断
      X += P #XとPを足す、二進数3桁目は4のため
      utime.sleep(1) #1秒の遅延を発生させる

      reading = sensor_temp.read_u16() * conversion_factor #センサーの値を読み取る。(3回目)
      if N < reading: #読み取った値に平均がNより大きい場合 Nに実数を入力
      X += Q #4桁目の正負の判断
      else : #上記の否定(読み取った値がXより小さい場合)
      Q = 0 #4桁目の正負の判断
      X += Q #XとQを足す、二進数2桁目は2のため
      utime.sleep(1) #1秒の遅延を発生させる
      utime.sleep(1) #一秒の遅延を挟む
      reading = sensor_temp.read_u16() * conversion_factor

      if N < reading: #読み取った値に平均がNより大きい場合 Nに実数を入力
      X += R #4桁目の正負の判断
      else : #上記の否定(読み取った値がXより小さい場合)
      R = 0 #4桁目の正負の判断
      X += R #XとRを足す二進数1桁目は1のため
      utime.sleep(1) #1秒の遅延を発生させる
      #ここまでで読み取った数値が分かるようになっている
      if X == 9:
      print = seg_9
      elif X == 8:
      print = seg_8
      elif X == 7:
      print = seg_7
      elif X == 6:
      print = seg_6
      elif X == 5:
      print = seg_5
      elif X == 4:
      print = seg_4
      elif X == 3:
      print = seg_3
      elif X == 2:
      print = seg_2
      elif X == 1:
      print = seg_1
      elif X == 0:
      print = seg_0
      else :
      print = seg_10 #ここまででXに対応する7seg引数の呼び出し
      #GPIOの電圧を制御
      GPIO.output(print, GPIO.HIGH) #GPIOの出力をHigh(3.3V)にする、seg_nを点灯
      time.sleep(5) #5秒間待つ
      GPIO.output(print, GPIO.LOW) #GPIOの出力をLow(0V)にする、seg_nを消灯
      #GPIOをクリーンアップ
      GPIO.cleanup()

    • @Shartick
      @Shartick  2 роки тому +1

      ありがとうございます。コード拝見しました。
      おそらく何か既存のコードを参考に作成されたのではないかと思いますが、参考にした元のコードがラズパイPicoのものではなく普通のラズパイ(Linuxベース)用のようです。
      このRPi.GPIOはPythonのモジュールですが、ラズパイPico上で動くMicroPythonにはこのモジュールがないためimportできずエラーになります。
      (ラズパイPicoでは通常"machine"というモジュールをimportしてGPIOにアクセスします。過去動画の説明欄を見ていただくとサンプルコードがあります)
      なお、MicroPython用のRPi.GPIOに相当するコードを探してみたところ、以下のフォーラムに情報が見つかりました。
      forums.raspberrypi.com/viewtopic.php?t=309263
      下記のコードをThonnyに貼り付けて保存する際、保存先"Raspberry Pi Pico"を選択し、右クリックして"New Directory..."を選び"RPi"というフォルダを作成します。
      その中に"GPIO.py"という名前で保存すれば、メインのコード内で"import RPi.GPIO as GPIO"と書くことで、完全ではないですがRPi.GPIOっぽい動きをしてくれそうです。
      ただ、下のコードを見た感じsetupとoutputとinputしか実装されていないので、GPIO.setmode()やGPIO.cleanup()に相当する部分は自分で実装する必要がありますね…。
      ========以下フォーラムより転載========
      from machine import Pin
      BCM = 0
      OUT, IN = 0, 1
      LOW, HIGH = 0, 1
      PUD_DOWN, PUD_UP, PUD_NONE = 0, 1, -1
      gpio = [ None ] * 32
      def setwarnings(giveWarnings) : pass
      def cleanup() : pass
      def setmode(mode) : pass
      def setup(pin, mode, pull_up_down=PUD_NONE):
      if mode == OUT : gpio[pin] = Pin(pin, Pin.OUT)
      elif pull_up_down == PUD_DOWN : gpio[pin] = Pin(pin, Pin.IN, Pin.PULL_DOWN)
      elif pull_up_down == PUD_UP : gpio[pin] = Pin(pin, Pin.IN, Pin.PULL_UP)
      else : gpio[pin] = Pin(pin, Pin.IN)
      def output(pin, level):
      if level : gpio[pin].high()
      else : gpio[pin].low()
      def input(pin):
      return gpio[pin].value()

    • @user-bc3lp8yf3j
      @user-bc3lp8yf3j 2 роки тому

      @@Shartick今まで疑問に思っていた部分がスッキリしました。ここまで詳しく説明してくださり本当にありがとうございます!

    • @Shartick
      @Shartick  2 роки тому +1

      とんでもないです。わずかながらでもお役に立てたのであれば幸いです。