私的AI研究会 > RaspiPico

Raspberry Pi Pico

 新マイコンボード「Raspberry Pi Pico」を検証する。

※ 最終更新:2022/09/19 

Raspberry Pi Pico を動かす

開発環境のセットアップ

  1. Raspberry Pi Picoの[BOOTSEL]ボタンを押しながらUSBケーブルをパソコンに接続すると BOOTSELモードで起動
  2. ディスクトップのダイアログ表示に従って「ファイルマネージャーで開く」を押す
  3. 「INDEX.HTM」を選択する
  4. 表示されたページを下にスクロールし「MicroPython」のページからMicroPythonファームウェア(UF2ファイル)をダウンロード
  5. ダウンロードしたMicroPythonファームウェアのUF2ファイルをPicoのRPI-RP2ドライブにコピー
    これでファームウェアの書き込みは完了 Raspberry Pi Picoが自動的にリブートされる

ホスト側で Python統合開発環境「Thonny」を動かす

  1. Raspberry Pi OS の場合あらかじめインストールされている Thonny IDEを利用する
  2. 「メニュー」→「プログラミング」→「Thonny IDE」を起動する
  3. Thonny IDE 右下の Pythonをクリック 表示される項目の中から「MicroPython (Raspberry Pi Pico)」を選択
    エディタにサンプル・コードを記述する
    import machine
    import utime
    led = machine.Pin(25, machine.Pin.OUT)
    while True:
        led.value(1)
        utime.sleep(1)
        led.value(0)
        utime.sleep(1)
  4. コードを書き終えたら、メニューのRunボタンをクリック
  5. 保存先を聞かれるので「Raspberry Pi Pico」を選択 ファイル名を入力してOKボタンをクリック

    ・Raspberry Pi Picoへのプログラムの書き込みと実行が行われる
    ・基板上のLEDが1秒ごとに点滅すれば OK
    ・プログラムを停止は、Ctrl + C または Thonny IDE のメニューにある Stop ボタンを押す

LED点滅プログラム

  引用 → https://www.marutsu.co.jp/pc/static/large_order/zep/m-z-picoled-da1

  1. PWM機能を使用してLEDを点滅するプログラム
    $ vi blink_pwm.py
    
    from machine import Pin, PWM
    import utime, random
    pwm = PWM(Pin(25))
    pwm.freq(100)
    
    while True:
        x = random.random()
        pwm.duty_u16(int(65535*x))
        utime.sleep(0.1)
        print(x)
  2. ろうそく風ゆらぎ発光(間欠カオス発光)のプログラム
    疑似的に1/fゆらぎを実現するには,「間欠カオス法」を利用する。
    現在の発光強度x(t)が0.5未満かそれ以上で、次の発光強度を求める演算方法を変える。
    x(t)が,完全OFF(0)や完全ON(1.0)に近づくと、発光強度の値 “x(t+1)”が変化して難くなり貼り付くためランダム関数を使って値を設定しなおす。
    $ vi blink_candle.py
    
    from machine import Pin, PWM
    import utime, random
    pwm = PWM(Pin(25))
    pwm.freq(100)
    
    x = 0.5
    while True:
        if 0.05 <= x < 0.5:
            x = x + 2 * x * x
        elif 0.5 <= x < 0.95:
            x = x - 2 * (1 - x) * (1 - x)
        else:
            x = random.random()
        pwm.duty_u16(int(65535*x))
        utime.sleep(0.1)
        print(x)

シリアル通信(UART)のテスト

  引用 → https://blog.goo.ne.jp/jh7ubc/e/e31b062f42e221c2b76eb74799c17107

  1. Raspberry Pi Pico は、UART0とUART1の2つのUARTコントローラを持つ

    UART(id) デフォールト値
    idTXRXbaudrateparitystopbit
    0GPIO0GPIO1115200なし1
    1GPIO4GPIO5115200なし1
  2. ブレッドボードに回路を作成
    ・信号レベル変換 (3.3V → 5V) のため FT234 を使用する
    ・FT234 の RXを Pico の 6番ピン GP4(TX) ,TXを 7番ピンGP5(RX)に接続
    ・FT234の電源は 5V(VBUS) に接続

  3. ループバック テストプログラム (Pico 側)
    $ vi uart_test.py
    
    from machine import UART,Pin
    
    u = UART(1)
    
    u.write('UART test\n\r')
    
    while True:
        if u.any() > 0:
            u.write(u.read(1))
  4. ホストPC側は「TeraTerm」を使う
    ・Picoからの "UART test" を受信して表示、PC のキーボードから送られた文字をそのまま送り返し受信する

    ・初期設定と起動時の受信バッファのクリアを追加した ループバック テストプログラム
    $ vi uart_test1.py
    
    from machine import Pin, Timer, UART
    
    uart = UART(1, 115200, tx=Pin(4), rx=Pin(5), timeout=100)
    
    def clear_buf():
        while True:
            rxData = uart.readline()
            if rxData == None:
                break
            utime.sleep(0.005)
    
    clear_buf()
    uart.write('UART test')
    
    while True:
        rxData = uart.readline()
        if rxData is not None:
            print(rxData)

更新履歴

 

参考資料


Last-modified: 2022-09-19 (月) 11:00:06