● 実験テーマ148

「Raspberry Pi Pico互換機YD-RP2040(4MB)の試用」
(MachiKania type P メイン基板組立てキットを購入した際に同封されていたYD-RP2040(4MB)基板の試用)

■ 2023.3.30
  ・オレンジピコショップで「MachiKania type P メイン基板組立てキット」を購入した際に、
   同封されていた「Raspberry Pi Pico互換機YD-RP2040(4MB)」基板の試用実験をやりたいと思う。



   ただ、この基板は、MachiKania type Pでは使用出来ない。Raspberry Pi Picoを使う。

  <まずは、どこまで互換性があるか等、web検索してみた:たまねぎブログさんより抜粋>
   (1) 特徴概要
     @ ピンは高い互換性がある。
     A Raspberry Pi Pico より多くのピンが扱えるのと
        リセットボタン・ユーザボタン・WS2812(RGB LED)などユーティリティも豊富。
     B フラッシュメモリは購入時に4MBか16MBを選択するが、
        どちらでもコスパがいい。

   (2) 比較

   差分項目     YD-RP2040     RaspberryPi Pico
========================================
接続            Type C         Micro B
-----------------------------------------------------------------------
フラッシュMemory   4, 8, 16MB
             3種類のラインナップ    2MB
-----------------------------------------------------------------------
ADC            4             3
-----------------------------------------------------------------------
GPIO           28            26
-----------------------------------------------------------------------
ボタン           BOOT
            RESET          BOOT
            USER (GP24)
-----------------------------------------------------------------------
LED          青(GP25)
            WS2812(GP23)     緑(GP25)
=========================================

note:YD-RP2040のメーカは「VCC-GND studios」


■ 2023.4.2
  
・動作チェックの前に、基板に付属のピンヘッダを実装した。

  Picoと同じ手順で、MicroPythonファームウェアをダウンロードして,YD-RP2040にコピー(書込み)を試してみた。
  → ダウンロードしたUF2ファイルは、PICOの時のバージョンとは異なり更新されているようだ。
     ・Picoの時のバージョン:rp2-pico-20230227-unstable-v1.19.1-900-gfc4c47f7b.uf2
     ・今回のバージョン  :rp2-pico-20230331-unstable-v1.19.1-995-g0a3600a9a.uf2

  → 今回のバージョン:rp2-pico-20230331-unstable-v1.19.1-995-g0a3600a9a.uf2を、
     RPI-RP2(J:)にコピーしたら、暫く青LEDが点滅してセットアップが完了し書込まれたようだ。

    ※ Picoの時のソースコードそのままで、Lチカ:led_flashing.pyと、タイマー割込み;timer_2.py
       が、Thonny上で問題無く動いた。

  ・Lチカのビデオファイルです。
   こちらからどうぞ→ video001.mp4(173KB)

  ・タイマー割込みのビデオファイルです。
   こちらからどうぞ→ video002.mp4(564KB)

-----------------------------------------------------------------------------------------

  ・ボード上に実装されている、NeoPixcel(LED):WS2812の点灯を試してみた。
   WEB検索したら「ロジカラブログ」さんのサイトに、Picoのサンプルコードが載っていたので、
   これを参考にしてみた。

   (1) NeoPixel_simple_1.py
     ・Picoの外部に、8x8のNeoPixcelを接続した例で、GPIO0をDinに接続してある。
      ここを、GPIO23に変更しただけであるが・・・試してみる。
      サンプルコードでは、白色に点灯するはず。


# NeoPixel_simple_1.py ---------------------------------------------------------------------

import array, time
from machine import Pin
import rp2

# NeoPixel WS2812Bの指定
NUM_LEDS = 1 # NeoPixelの数
LED_PIN = 23 # NeoPixel信号接続端子

# 以下はNeoPixelを使用するための設定、このまま書いておく ---------------------------
# NeoPixcel WS2812の制御タイミングに合わせたパルスを生成するための設定をアセンブラで指定
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812(): 
T1 = 2
T2 = 5
T3 = 3
wrap_target()
label("bitloop")
out(x, 1) .side(0) [T3 - 1]
jmp(not_x, "do_zero") .side(1) [T1 - 1]
jmp("bitloop") .side(1) [T2 - 1]
label("do_zero")
nop() .side(0) [T2 - 1]
wrap()
# クラスStateMachineを使用して、正確なパルスを出力するための設定を行う
sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(LED_PIN))
# 設定したクラスStateMachineを有効にして使えるようにする。
sm.active(1)
# LEDのRGBの値を指定する24bit(8bit x 3)の配列をNeoPixelの数で準備
ar = array.array("I", [0 for _ in range(NUM_LEDS)])

# NeoPixel点灯処理関数、このまま書いておく ------------------------------------
def drawpix(num, r, g, b):
ar[num] = g << 16 | r << 8 | b # NeoPixel制御パルス用の24bitデータを左ビットシフトとORで生成

# 以下に点灯させる処理を記入--------------------------------------------------
# 1個を白色点灯(複数ある場合は最初の1番目のみ点灯)
# 点灯させたいNeoPixelの番号(num)とRGB(赤緑青)の明るさを0〜255(30程でも十分明るい)で指定
drawpix(0, 10, 10, 10) # LED点灯処理関数呼び出し(num, R, G, B)

sm.put(ar, 8) # 点灯実行(NeoPixel制御パルス出力)
time.sleep_ms(100)

→ これはあっけなく上手く行く。

   (2) NeoPixel_simple_2.py
     ・ボタンを押すたびに色変更を試す。
      白→ 赤→ 緑→ 青 と変化する。
     ・SWポートはGPIO20を使っているが、これをボード上のユーザーSW:GPIO24に変更すればOKなはず。

import array, time
from machine import Pin
import rp2

# NeoPixel WS2812Bの指定
NUM_LEDS = 1 # NeoPixelの数
LED_PIN = 23 # NeoPixel信号接続端子

# 以下はNeoPixelを使用するための設定、このまま書いておく ---------------------------
# NeoPixcel WS2812の制御タイミングに合わせたパルスを生成するための設定をアセンブラで指定
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812(): 
T1 = 2
T2 = 5
T3 = 3
wrap_target()
label("bitloop")
out(x, 1) .side(0) [T3 - 1]
jmp(not_x, "do_zero") .side(1) [T1 - 1]
jmp("bitloop") .side(1) [T2 - 1]
label("do_zero")
nop() .side(0) [T2 - 1]
wrap()
# クラスStateMachineを使用して、正確なパルスを出力するための設定を行う
sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(LED_PIN))
# 設定したクラスStateMachineを有効にして使えるようにする。
sm.active(1)
# LEDのRGBの値を指定する24bit(8bit x 3)の配列をNeoPixelの数で準備
ar = array.array("I", [0 for _ in range(NUM_LEDS)])

# NeoPixel点灯処理関数、このまま書いておく ------------------------------------
def drawpix(num, r, g, b):
ar[num] = g << 16 | r << 8 | b # NeoPixel制御パルス用の24bitデータを左ビットシフトとORで生成

# 以下に点灯させる処理を記入--------------------------------------------------
# 1個の色をボタンを押すたびに変更(複数ある場合は最初の1番目のみ使用)
btn = Pin(24, Pin.IN, Pin.PULL_UP) # GP24を入力端子(プルアップ)に設定
cnt = 0 # ボタンON回数カウント用
state = False # ボタン状態格納用

while True:
# ボタン回数カウント
if btn.value() == 0 and state == False: # GP20がONでstateがFalseなら
state = True # stateをTrueに
cnt = cnt + 1 # ボタン回数カウント+1
if btn.value() == 1: # GP20がOFFなら
state = False # stateをFalseに
# ボタン回数カウントリセット
if cnt == 4: # ボタン回数カウントが4なら
cnt = 0 # 0リセット
# LED点灯処理
if cnt == 0: # cntが0なら白点灯
drawpix(0, 10, 10, 10) # LED点灯処理関数呼び出し(num, R, G, B)
elif cnt == 1: # cntが1なら赤点灯
drawpix(0, 30, 0, 0) # LED点灯処理関数呼び出し(num, R, G, B)
elif cnt == 2: # cntが2なら緑点灯
drawpix(0, 0, 30, 0) # LED点灯処理関数呼び出し(num, R, G, B)
elif cnt == 3: # cntが3なら青点灯
drawpix(0, 0, 0, 30) # LED点灯処理関数呼び出し(num, R, G, B)

sm.put(ar, 8) # 点灯実行(NeoPixel制御パルス出力)
time.sleep_ms(100) # 遅延時間

→ これもあっけなく上手く行く。

  ・NeoPixe(W2812B)lのビデオファイルです。
   こちらからどうぞ→ video003.mp4(422KB)


■ 2023.4.3
  
・昨日の最後に試した、NeoPixel_simple_2.py「ボタンを押すたびに色変更を試す。白→ 赤→ 緑→ 青 と変化する」
   を使って、Dinのシリアル制御信号を自作ロジアナにて観測してみたが、サンプル周波数が低く(1MSa/s)無理だった。


■ 2023.4.4
  
・今度は中華オシロ「DSO 620」で試してみる。
   スペック上は
   最大等価時間サンプリングレート(繰り返し信号) – 20MSa/s
   最大リアルタイムサンプリングレート – 2MSa/s
   アナログ帯域幅 – 1MHz
   なので、1MHzまではギリギリいけそうだが・・・

  → 5uS/Dレンジで同期が取れた。取得成功
     但しギリギリのサンプルFの為、狭いパルスは真面なレベルになっていないが、Hi, Loは判別出来るレベル。
     RGB各期間:10uSなのでブロック転送で、30uSかかる。
     データビット=1.25uS長(800Kbps)

<取得波形結果>

 note1:波形の取得は中華オシロの、画面のハードコピー機能(メモリバッファ上に記録)を活用した。
      尚、測定ポイントは、W2812B-4pin:Dinのプルアップ抵抗=R14の信号側とした。

 WAVE SAVE BUF  発光色  RGBの明るさ指定    SAVE FILE名
============================================
  BUF1        白    10, 10, 10         001.bmp
------------------------------------------------------------------------------
  BUF2        赤    30, 0, 0              002.bmp
------------------------------------------------------------------------------
  BUF3        緑     0, 30, 0             003.bmp
------------------------------------------------------------------------------
  BUF4        青     0, 0, 30             004.bmp
============================================

note2:RGB(赤緑青)の明るさを0〜255(30程でも十分明るい)で指定
     これは、プログラム上のパラメータ指定順だが、転送時は、GRBの順に
     転送されることに注意が必要

note3:'0'コードと、'1'コードの判定は、Hi区間とLo区間のパルス幅で行う。
     マルツの製品ページ「赤・緑・青のフルカラーLED・WS2812Bの使い型」の記事
     とても参考になりました。
     そこから以下、説明図を抜粋しました。


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ149へ →