goo blog サービス終了のお知らせ 

JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Raspberry Pi Pico Micro Python ロータリーエンコーダ テスト

2021-11-15 18:23:48 | Raspberry Pi Pico
 前の記事でテストしたピン割込みを利用して、ロータリーエンコーダの回転方向を判定するスクリプトのテストをしました。

 まず、回転報告を判定する方法を説明します。ロータリーエンコーダのA,B端子はプルアップしておきます。ロータリーエンコーダを回転させると下の図のように、各端子の電圧が時間とともに変化します。
 A,Bの状態が変化した時(割込みが発生した時)のA,Bの値を読み取り、(B<<1)+Aの前の値と現在の値のXORをとると、時計回り(右回り)の時は、その値は、0か1になり、反時計回り(左回り)の時は、2か3になります。
 つまり、判定式D<2で時計回り、D>=2の時反時計回りと判定することができます。

 スクリプトです。
  4行目5行目 ロータリーエンコーダのA,Bが接続されるGPIO14とGPIO15を入力、プルアップに設定。
 34行目35行目 ピン割込みの設定、トリガは、立下りと立ち上がり、両方で割込みがかかるように設定。

 14行目からが、割込み時に回転方向を判定する関数です。
 最初、countをインクリメント、デクリメントするのに、count++,count--を使ったのですが、これが原因でエラーがでてしまいました。この原因が分からず、数時間を無駄にしました。MicroPythonではこの記述は通らないんですね。
 それから、判定の基準ですが、今までPICなどでのプログラムでは、count>=4でRIGHT、count<=4でLEFTとしたのですが、count>=3,count<=3の方がスムーズに判定するので、この値にしました。
 このスクリプトで実際にロータリーエンコーダを動かしてみると、一番最初のクリックだけ判定しませんが、その後はロスなく判定してくれました。

2021.12.3追記
 上の問題を解決する方法が分かりました。スクリプトを次のように訂正してください。最初PinA=1,PinB=1なので
 8行目 befDat=0x11 としてください。
これで、最初からスムーズに動くはずです。

 判定された結果は、shellに表示されます。


 接続回路図です。

ブレッドボードです。ロータリーエンコーダは、中華製の安価なものを使いました。かなりチャタリングがあるのですが、今回のスクリプトは、うまく回転方向を判定できます。



Raspberry Pi Pico MicroPython Pin割込みテスト

2021-11-14 11:27:59 | Raspberry Pi Pico
 Raspberry Pi Picoのピン(状態変化)割込みのテストをします。

 例として、GPIO15のスイッチを押すたびにLEDが点灯と消灯を繰り返すスクリプトを試します。
 4行目 スイッチ(btn)は、GPIO15に接続し、入力、プルアップします。
 11行目 ピンの電圧の立下り(FALLING)で割込みがかかります。割込みがかかるとhandlerで指定された関数(ここでは、led_toggle())が実行されます。
 

 回路図です。

 ブレッドボードです。

 タクトスイッチを使っていますが、チャタリングのため、押し方によっては誤動作することがあります。


Raspberry Pi Pico MicroPython Timer割込み

2021-11-12 23:15:25 | Raspberry Pi Pico
 Raspberry Pi Pico(RP2040)は、内部に16ビットタイマを持っていて、周期的(定期的に)割込みをかけ、設定した処理を行うことができます。

 タイマの動作モード(mode)は、
 ワンショット(Timer.ONE_SHOT)と
 周期タイマ(Timer.PERIODIC)の2つです。

 割込みがかかった時に呼び出される関数(callback関数)を指定します。

 タイマ周期の指定方法は、
 freq(周波数(Hz単位))と
 tick_hz引数とperiod引数で周期を指定する方法があります。

 この割込みを使うためのmachine.Timerコンストラクタの仕様は
 Timer(id,mode,callback,period,tick_hz,freq) です。
 id=-1
 mode Timer.ONESHOTまたはTimer,PERIODIC
 period タイマのカウント数(tick_hz単位でのカウント数)
 tick_hz タイマのカウント周波数(Hz単位の整数)
 freq タイマの周波数(Hz単位の整数)

 Pico内蔵のLED(Pin25に接続されている)をタイマ割込みで点滅させる、いわゆるLチカのスクリプトです。
 Web上にあったいくつかの例をコピーさせていただきました。いずれも周期タイマ(PERIODIC)を利用しています。

例1 cllback関数tica2()を定義しています。initはタイマを初期化するメソッドです。


例2 コンストラクタTimerの中にすべての処理を記載しています。

例3 タイマ初期化メソッドの中にすべての処理を記載しています。

 例1~例3のいずれも動作しました。

 lambdaは、ラムダ式、無名関数といい、こんな風に使われるですね。まだよく理解していません。
 Python(MIcroPython)については、まだまだ勉強不足でよくわ分からないことが多いですが、様々な事例を実行していくことによって、少しずつ習得していこうと思っています。

Raspberry Pi Pico MicroPython シリアル通信(UART) テスト

2021-11-12 07:46:04 | Raspberry Pi Pico
 Raspberry Pi Picoのシリアル通信のテストをします。
 Picoは、UART0とUART1の2つのUARTコントローラを持っています。

 UART(id)  id=0 or 1 だけ指定した時のデフォルトは、次のとおりです。
 id      TX       RX      baudrate     parity    stopbit
 0 GPIO0 GPIO1   115200  なし  1
 1    GPIO4 GPIO5   115200  なし  1

 UART(1)だけを指定した時のUARTテスト用のスクリプトです。送受信は定番の通信ソフトTeraTermを使います。
 5行目 Picoからパソコン(TeraTerm)に「UART test」を送信します。
 8行目 any()は、読み込めるバイト数を返します。
 9行目 read(1)は、1文字読み込みです。このスクリプトは1文字入力されれば、その文字を送信します。



 USBシリアル変換は、FT234を使い、USBに接続しました。接続回路図です。


ブレッドボードです。FT234のRX,TXはPicoの6番ピンGP4(TX),7番ピンGP5(RX)に接続します。FT234の電源は5V(VBUS)に接続します。

 TeraTermは、下のように設定します。ポート番号は接続したパソコンに合わせます。

 TeraTermの画面です。Picoから「UART test」を受信して表示し、パソコンのキーボードから送られた文字をそのまま送り返します。

 UART(0)とUART(1)では、次のGPIOの組を使用することができます。
  UART(0)     UART(1)
  TX  RX     TX  RX
 GPIO0 GPIO1  GPIO4 GPIO5
 GPIO12 GPIO13 GPIO8 GPIO9
 GPIO16 GPIO17

 UART(1)でbaudrate, 9600bps  ,TX GPIO8 ,RX GPIO9を使う場合は
 UART(1,baudrate=9600,tx=Pin(8),rx=Pin(9))とします。
 この場合、スクリプトの1行目にimport UART,Pin として、Pinをimportしておきます。

Raspberry Pi Pico MicroPython PWM テスト

2021-11-11 08:22:21 | Raspberry Pi Pico
 Raspberry Pi PicoのPWM(Pulse Width Modulation)のテストをします。
 Picoは、DAC(デジタルアナログコンバータ)を持っていませんので、Arduinoと同じように疑似アナログ出力としてPWMを使うことになります。

 PWM信号は、全てのGPIOに出力可能です。
 例として、GP15に1000Hz、デューティ比50%の信号を出力するスクリプトです。
 4行目 GP15にPWM信号を出力します。
 5行目 周波数を1000Hzに指定します。
 6行目 デューティ比を設定します。16ビット(0~65535)で指定します。この例では、32768ですから、50%になります。


 出力された波形です。設定した通りの波形です。


 実際の周波数を測定してみました。

 確かに1000Hzです。けっこう正確です。周波数は100Hzから60kHzまで設定できます。

 dutyを設定する方法は、duty_u16( ) の他に、dutyの幅をns単位で設定できる duty_ns( ) があります。

 deinit() でPWMを無効化できます。

 PicoのGPIOは、30個ありますが、下の表のようなグループに分けられ、周波数は、スライス単位で、デューティは、チャンネル単位で設定します。

 スライス  チャンネルA    チャンネルB
  0   GPIO0 GPIO16  GPIO1 GPIO17
  1   GPIO2 GPIO18  GPIO3 GPIO19
  2   GPIO4 GPIO20  GPIO5 GPIO21
  3   GPIO6 GPIO22  GPIO7 GPIO23
  4   GPIO8 GPIO24  GPIO9 GPIO25
  5   GPIO10 GPIO26   GPIO11 GPIO27
  6   GPIO12 GPIO28   GPIO13 GPIO29
  7     GPIO14      GPIO15