● 実験テーマ146

「Raspberry Pi Pico事始め」
 (KENKENさんのサイトを見ていたら、気になる製品情報が・・・「MachiKania type P」というもの。その前にRaspberry Pi Picoの事始めを。)

■ 2023.2.8
  ・「KENKEN」さんのサイトを見ていたら、気になる製品情報が・・・「MachiKania type P」というもの。
   <特徴>
    @ 安価なRaspberry Pi Picoを利用してBASICプログラムを動作させることができる、オープンプラットフォーム
    A BASICプログラムは実行時に自動的にコンパイルされるので高速動作を実現しています。
    B 従来のMachiKania type ZやMachiKania type Mとも互換性があるため、
       過去のプログラムも簡単に動作させることができます。
    C I/O機器制御にも対応しているので、組み込み用途にも適しています。

    NOTE:Raspberry Pi Pico
        ・SWITCH-SCIENCEにて、770円で販売されている。
         ※ ラズベリー・パイという名前は付いているが、Linuxは動かず、純然たるマイコンボードになる。 230225 追記

          <概要:SWITCH-SCIENCEの当該商品ページより抜粋>
           Raspberry Pi財団が独自に開発したARM Cortex M0+デュアルコアのRP2040マイコンを搭載した開発基板です。
           C/C++およびMicroPythonで開発が可能です。
           既存のRaspberry Piとは異なりLinux OSは搭載できませんのでご注意ください。

           USBケーブルやピンヘッダは付属も実装もされておりませんので、別途お買い求めください。
           ピンヘッダはんだ付け済を発売しました。

           C/C++ SDK、もしくは公式に提供されているMicroPythonインタプリタを使って開発が可能です。
           本製品および搭載しているRP2040マイコンチップの技術資料も用意しています。

           MicroPythonはPython 3ベースの組み込み用プログラミング言語です。
           USBをPCに接続すると表示されるドライブ(マスストレージ)に
           ドラッグアンドドロップすることでプログラムを書き込むことができます。

           どちらの言語もWelcome to Raspberry Pi RP2040 (Raspberry Pi財団のRP2040紹介ページ)
           に使い方が書いてあります。

          <特徴>
           @ Raspberry Pi(UK)設計のRP2040マイコン搭載
           A デュアルコア ARM Cortex M0+プロセッサ、最大動作周波数 133 MHz
           B SRAM:264KB、フラッシュメモリ:2MB
           C 端面スルーホールを備えているため直接キャリアボードへのはんだづけが可能
           D USB 1.1 ホスト/デバイス両対応
           E 低消費電力スリープモードおよびドーマントモードが利用可能
           F USBを介しマスストレージを使ったドラッグアンドドロップによるプログラムの書き込みが可能
           G 26 x 多機能GPIOピン
           ➈ 2 x SPI、2 x I2C、2 x UART、3 x 12 bit ADC、16 x PWMチャンネル
           I 正確なクロックとタイマーを搭載
           J 温度センサ搭載
           K 高速な浮動小数点ライブラリを搭載
           L 8 x プログラマブルI/O(PIO)
           M microUSB端子搭載
           N 寸法:51 x 21mm

  ・オレンジピコショップで独自の基板と部品キットがあります。液晶、ゲームキーボードは別売です。
   <MachiKania type P メイン基板組立てキット>
    @ 価格:1595円
    A ORANGE-Rogue C基板を流用したMachiKania type P 組立てキットです。
       説明書はありません。写真と回路図でわかる方向けです。
       USB type Cケーブル、3.2インチTFT液晶モジュール、
       ゲームキーボード 組立てキット、8Pコネクター付きケーブルは別売です。

       ※ 3.2インチTFT液晶モジュール:YAHOOショッピング- オレンジピコショップの委託販売 で購入可
         → ILI9341、SPI、3.2インチTFT液晶モジュールです。解像度は320×240です。2189円

         →  完全互換ではないが、aitendoの以下の物が使えるというweb情報を見付けた。(gokanさんface book pic fun clabより)230224 追記
            ■ 松元 博司
             「aitendoで、LCDがあったので、購入してみました(2.8inch TFT SPI 320 x 240dot)いつも使っているのは2.4inch
            → 残念ながら現在は「在庫切れ」
              <仕様概要:商品コード:M028C9341SD
               ・2.8インチTFT液晶モジュールの実装済み品
               ・搭載コントローラチップ:ILI9341
               ・解像度:240x320
               ・SDソケット実装済み
               ・信号インターフェース:SPI
               ・動作電源:3.3V
               ・ORANGE picoで使用可能
               ・価格:1500円

              なんと写真のように1ピッチ短い!!!
              左右のコネクタ部を半ピッチづつ内側に曲げて、なんとか動かすことができました!!!
              さすが、中国製です、いろいろなところで作っているようです!!! 」

            ■ KEN KEN
              「オレンジピコショップの基板は3.2インチで、
              アイテンドーのは2.8インチですよね。
              1ピン分ずれてます。
              2.4インチのものもあって、確かさらにもう1ピンずれてます。そういうもののようです。」

      ※ ゲームキーボード:YAHOOショッピング- オレンジピコショップの委託販売 で購入可
           → 1098円
      ※ 全部揃えると、計:5652円


■ 2023.2.23
  ・<kenken_hpより>
    USBキーボード接続
    (2023.1.28追加、Ver1.20以降で対応)
    Ver1.20からUSBキーボードが利用できるようになりました。
    これにより、PCなどを使用せずMachiKania type Pのみでプログラムを作成し、
    SDカードに保存や実行ができるようになりました。

    またBASICのプログラムからもキー読み取りができるようになりました。
    USBキーボードを利用する場合、専用の実行ファイルをRaspberry Pi Picoに書き込む必要があります。
    実行ファイル名は「phyllosoma_kb.uf2」です。

    従来の「phyllosoma.uf2」と同様の方法で書き込みを行ってください。
    USBキーボードはRaspberry Pi PicoのマイクロUSBコネクタに、
    USB On-The-Go(USB OTG)変換ケーブル(変換アダプタ)を介して接続します。
    また、Raspberry Pi PicoのVBUSピン(40ピン)に+5Vの電源を供給する必要があります。
    【注意】 Raspberry Pi Pico互換ボードでVBUS端子がない場合、USBキーボードは利用できません(YD-RP2040など)。
         純正Raspberry Pi Picoをご用意ください。
         またUSBキーボードの種類によっては認識しないものもあります。その場合は別のキーボードをお試しください。


■ 2023.2.24
  ・SWITCH-SCIENCEにて「Raspberry Pi Pico」発注済
   税抜き価格:715円
   消費税:     65円
   配送料:    200円(ヤマト運輸ネコポス)
------------------------------------------
                                    915円

  ・今迄の路線とは一風異なる感のある、Raspberry Piなので「MachiKania type P」をやる前に
   まずは初体験として、最初の一歩ということでボード上に実装されているledを点滅させる「Lチカ」
   を試してみることにした。
   今更ながら初めて「ブレッドボード」を使ってみることにする。
  → とりあえず秋月で以下を注文した。
     @ P-05294ブレッドボード BB-801 220円(税込み)
       ■穴数:400
       ■サイズ:82X53X8mm
       ■電源ライン(赤・青):2系統

     A P-05160ブレッドボード・ジャンパーワイヤ 14種類x10本 400円(税込み)
       ・導線のサイズ: Φ0.65mm(AWG22)
       ・専用ケース入り
       ・内容物
        下記の物が10本ずつ入っています。
        @2mmA5mmB7mmC10mmD12mmE15mmF17mmG20mmH22mmI25mmJ50mmK75mmL100mmM125mm

     B C-05371ブレッドボード・ジャンパーワイヤ(オス−オス) 10cmセット 180円
     C K-05148ブレッドボード用DCジャックDIP化キット 100円


■ 2023.2.25
  ・SWITCH-SCIENCEから届いた。


■ 2023.2.26〜 2023.2.28
  ・いまさらだが今回初めてブレッドボードを使ってみる。
   使い勝手は未知数だが・・・
   自分にとっての懸念事項は、ブレッドボードのピン穴へのリード適合径が、MAX0.8mm(いわゆる細ピン対応)に対し、
   ラズパイ基板に実装するピンヘッダの径は標準の太さ= 0.64x0.64mmの角ピンで対角= 0.95mmの物を常用しているので
   ブレッドボードで試作実験する時、このままでは挿入が出来ない。(ラズパイ基板をソケットコネクタを使わないで直付けするなら別だが・・)
   そこで標準サイズ→ 細ピンサイズの変換基板治具を両面スルーホールのユニバーサル基板を使って作成した。
   ソケットコネクタとピンヘッダは表裏の位置関係になる為、簡単にそれぞれを結合できないので、
   ピンヘッダを半田付けする前に、細いワイヤをスルーホールに挿入しておいてから一緒にハンダ盛りし、そのワイヤの片側を
   ソケットコネクタのピンに半田付けした。
   この作業が面倒だったが何とか出来た。
   以下の写真を参照の事。



  ・マルツのページで
   [フレッシャーズ特別企画]
   初めの一歩!ラズパイPicoマイコン×PythonでLチカ入門
   開発環境のセットアップから点灯/消灯制御プログラミングまで

   著者:田口 海詩 / 企画:ZEPエンジニアリング /

   と言う記事を見付けた。
   ここの説明が具体的で分かり易そうなので、これを参考に進めてみる。

  <初めてのマイコン・プログラミング(プログラム名 L_chika.py)>
   (1) プログラムの説明
0 # -*- coding: utf-8 -*- # utf-8の文字コードで書くことを宣言する。
1 import machine,utime # モジュールをインポート
2 led= machine.Pin(25, machine.Pin.OUT) # GPIO25を出力ピンに定義
3 while True: # 繰返し
4 led.value(1) # LEDを発光
5 utime.sleep(0.5) # 0.5秒待つ
6 led.value(0) # LEDを消灯
7 utime.sleep(0.5) # 0.5秒待つ 

     @ 1行目は,Lチカに必要なモジュール(ライブラリ)の読み込みを行う。
        machineモジュールのI/Oピン制御命令でLEDを点滅させる。
        utimeモジュールは,時間を管理するための命令。
     A 2行目は,LEDに接続されているGPIO25ピンを出力端子にして、“led”と命名する。
     B 3行目以降は,実際にLEDを点滅するための命令
     C 4行目は,GPIO25ピンをONにしてLEDを発光させてる。
        4行目で0.5秒待ち、6行目でLEDを消す。
     D 7行目で,再度0.5秒待ち、4行目に戻り、これを延々と繰り返す。

--- note ---------------------------------------------------------------------------------------
  <Pythonでのコメントの書き方:「親バカエンジニアのナレッジ帳」サイトより抜粋>
  ・行の先頭に「#」を入れればOKです。
   # test comment out

   しかし、日本語でコメントを入れたい場合、ただ単に「#」を入れるだけではダメなのです。
   例えば、
   # テストコメント
   とすると、以下のようなエラーが出てしまいます。

SyntaxError: Non-ASCII character 'xe3' in file 〜 ファイル名 〜 on line 6,
but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

   コメントアウトでエラーが出てしまうなんて意外ですよね。
   要約すると、「アスキーコードじゃない文字列が含まれてるみたいだけど、
           何の文字コードでエンコードをするか宣言してくれないと処理できないよ」
   といった ところでしょうか。

   <解決策>
    ・utf-8の文字コードで書くことを宣言する。
     さて、こちらが根本解決になると思いますが、
     ソースの先頭に以下の記述を入れて、UTF-8で書いていることを宣言すればよいのです。

# -*- coding: utf-8 -*-

=========================================================================================
  <チェック開始>
   (1) PicoをBOOTSELモードで起動し,RP2040ページにアクセス
     @ Picoの[BOOTSEL]ボタンを押しながらUSBケーブルをパソコンに接続すると,PicoはBOOTSELモードで起動する。
     A BOOTSELモードで起動すると,パソコンのファイル・ブラウザからPicoのドライブ(RPI-RP2)を見ることができる。

        RPI-RP2(D:)
         |- INDEX.htm
         |- INFO_UF2.txt

       RPI-RP2フォルダにある“index.htm”ををクリックすると,Raspberry PiのRP2040ページにアクセスできる。

      ・↑- 上記やってみたが、Aでデバイスを認識してくれない??
       Picoの[BOOTSEL]ボタンを押しながら、PCのUSBポートに、MACHIKANIAで使っていたUSBケーブルを挿入したが、
       「このデバイスを認識出来ない」旨のポップアップ発生。
       → @ 基板上の、40pin:VBUS(+5V)⇔ 38pin:GND間にはテスターで、5.00Vが供給されていることを確認した。
          A ブレッドボード上から基板を抜いて単体で同じことをやっても同じ。

       → ※ PC側のUSBポート口を替えたら認識し、
            RPI-RP2(D:)
              |- INDEX.htm
              |- INFO_UF2.txt
            が見えた。

    RPI-RP2フォルダにある“index.htm”ををクリックすると,Raspberry PiのRP2040ページにアクセスできる。

   (2) MicroPythonファームウェアをダウンロードして,Picoにコピー
     @ Raspberry PiのRP2040ページにアクセスして,[MicroPythonのスタートページのタグ]をクリック。
     A MicroPythonのUF2ファイル(MicroPythonファームウェア)のダウンロードリンクをクリックして
        をダウンロードする。
     B ダウンロードしたMicroPythonファームウェアのUF2ファイルをPicoのRPI-RP2ドライブにコピーする。
        これで,MicroPythonファームウェアはRP2040に書き込まれる。

    ・↑- マルツの記事の「Raspberry PiのRP2040ページ」は数年前、2021年1月20日,ラズベリーパイ財団が500円でリリースした頃のもので、
     現在はデザイン(レイアウト)が、かなり変わっていた。
     別紙にキャプチャを撮ったので参照の事。
     おおまかな手順は以下になる。

     @ RPI-RP2フォルダにあるindex.htmをクリックし、Raspberry PiのRP2040ページにアクセス



     A [Getting started with MicroPython]ボタンをクリック



     B Download the correct MicroPython UF2 file for your board- Raspberry Pi Picoをクリック



     C uf2ファイルがダウンロードされる。

     D ダウンロードフォルダにダウンロードされた「rp2-pico-20230227-unstable-v1.19.1-900-gfc4c47f7b.uf2」
        ファイルをRPI-RP2(J:)にコピーで書込まれる。

   (3) 統合開発環境Thonny(Thonnyは、v3.3.3からPicoを標準でサポートし始めた)をダウンロードしセットアップ
      Pythonの統合開発環境“Thonny”をセットアップする。
     @ Thonnyのホームページにアクセスする。
        ページの右上にダウンロード先を示すリンクが表示されている。

     A 自分のOSにあったソフトウェアをダウンロードする。
      ・Windowsにカーソルを当てると各Windows OSのバージョン毎のダウンローダファイルの選択ポップアップ
       が表示されるので、その中から以下を選択。

       Official downloads for Windows

       Installer with 64-bit Python 3.10, requires 64-bit Windows 8.1 / 10 / 11
       thonny-4.0.2.exe (20.4 MB) ⇐ recommended for you

      ・インストーラがダウンロードされた。これを実行。
       @ 「Select install mode」→ Install for me only(recommended(推奨))を選択クリック
       A 「The wizard will install thonny-4.0.2 for your account」- [NEXT]をクリック
        B ◎ I accept the agreement- [NEXT]をクリック
       C C:\Users\PCUser\AppData\Local\Programs\Thonny- [NEXT]をクリック
        D 「Select Start Menu Folder
          Where should Setup place the program's shortcuts?」

          Setup will create the program's shortcuts in the following Start Menu folder.
          To continue, click Next. If you would like to select a different folder, click Browse

          [Thonny ] [Browse]

          デフォルトのままスタートメニューに「Thonny」という名前で登録し[NEXT]をクリック

       E 「Select Additional Tasks
          Which additional tasks should be performed?

          Select Additional Tasks you would like Setup to perform while installing Thonny,
          then did Next

          □Create desktop icon 」

          ディスクトップにアイコンは作らないので、このまま[NEXT]をクリック

       F インストール設定の確認画面になるので、このまま[install]をクリック
       G 「Great success!」- [Finish]をクリック



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

     B インストール後Thonnyを起動すると,以下の画面になる。

     C この設定のまま[Let's go!]をクリック
       
Editer画面右下は既に [Local Python 3・Thonny's Python]になっていた。    

------------------------------------------------------------------------------------------------------
  <Thonnyの使い方>
   (1) IDE画面の説明
     @ 上部:プログラムの新規作成・実行、停止などのコマンド
     A 中央部:Pythonコードを書く部分
     B 下部:実行結果を表示・エラー内容の表示

   (2) 簡単な Print文 を使い実行結果を見てみましょう。
     @ 中央部に以下のPythonコードを書きます
        print("Let's start with")

     A RUNする前に以下の手順でSAVEする。
       A-1.画面上部の”Save”ボタンをクリックします。
       A-2.次にファイル名を入力します。
          ファイル名は後から見てわかりやすい名前にします。
          今後、ターミナルで実行することも考えファイル名は、英数字にして保存すると良いです。

           例:sample.pi

     B 上部の ”Run” をクリックすると実行されます。
     C 実行結果は下部に表示されます。

「Python 3.10.9 ()
>>> %Run sample.py
Let's start with
>>> 

    ↑- これ上手く行く。



-------------------------------------------------------------------------------------------------------
  ・次にLチカを試した。

# -*- coding: utf-8 -*- # utf-8の文字コードで書くことを宣言する。
import machine,utime # モジュールをインポート
led= machine.Pin(25, machine.Pin.OUT) # GPIO25を出力ピンに定義
while True: # 繰返し
led.value(1) # LEDを発光
utime.sleep(0.5) # 0.5秒待つ
led.value(0) # LEDを消灯
utime.sleep(0.5) # 0.5秒待つ

を打ち込んでSAVE(2回目以降からは save saでセーブしないと上書きされてしまうので注意)
名前は「led_flashing.py」とした。

 ・runしたがエラーが出た。
  基本的にコメントの場所が駄目なようで以下のように修正した。

# utf-8の文字コードで書くことを宣言する。
# -*- coding: utf-8 -*-

# モジュールをインポート
import machine,utime
# GPIO25を出力ピンに定義
led= machine.Pin(25, machine.Pin.OUT)

# 繰返し
while True:
# LEDを発光
led.value(1)
# 0.5秒待つ
utime.sleep(0.5)
# LEDを消灯
led.value(0)
# 0.5秒待つ
utime.sleep(0.5)

 ・以下のエラー発生
  「import machine,utime 
   ModuleNotFoundError:No module named 'machine'」

 ※ どうもmachineというモジュールが見付からないらしい???


■ 2023.3.1
  ・
どうもmachineというモジュールが見付からないらしい???
   この原因を調べるのにかなり手間取ったが、解かれば何てことない。
   結局は、Thonnyの「インタプリタ」の設定の問題だった。

  ・「Tech and Investment」さんサイトの情報が非常に参考になった。
   ● Windows7で認識しない解決策あり Raspberry Pi Pico の使い方 〜セットアップからLED点灯まで〜
    ■ Importのエラーの解決方法
      ・以下のように「ModuleNotFoundError: No module named ‘machine’」と表示された場合は、
       Thonnyの「インタプリタ」の設定を行います。

        @ 「実行」の「Select interpreter…」を選択します。
        A インタプリタのタブを選択して、「MicroPython (Raspberry Pi Pico」」に変更してOKボタンを押します。
          (他は変更する必要はありません)。

        ※ 上記設定を行えば、Importのエラーは解消されるはずです。

     ↑- これを自分のマシンで試してみた。→ これでLチカは上手く行く。
        @ まずは、Thonny_IDEの、日本語表示設定だが、Thonny起動時に表示されるダイアログの
          Langage:[日本語 [ALPHA]]にする。(まあこれは英語でも良いかもと考え、英語のままにした。)
          iNITIAL SETTINGS [standerd]にする。
          (RaspberryPi の設定はボタンが大きい(子供むけ?)とのウワサだったのでStandardにしています。の情報有り)

        A 上タスクバー-[Run]- Configure Interpreter



        B 「Thonny options」ダイアログが開く



        C 現在 [Local Python 3]になっているのを、[MicroPython (Raspberry Pi Pico]に変更
           してOKボタンを押す。



           ちなみに実行ファイルの場所は[C:\Users\PCUser\AppData\Local\Programs\Thonny\python.exe]

        ※ 当たり前だが、PCと繋ぐUSBケーブルは必ず、データ線も電源線も切れていない良品(私の場合はタブレットに付属してたもの)
           を使う事。
           KENKENのゲーム機に使っていたケーブルは時々データ線が切れることがあって通信エラーを出していた。

        ※ 以下に、Lチカ実行前・後のIDEと、実行風景を示した。

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


■ 2023.3.2
  ・Picoにはパルス幅制御を専用に行うPWM機能が周辺回路(ペリフェラル)として組み込まれている。
   Lチカが出来たところで、次へ。
   「PWM」をやることにした。マルツのソースを参考にした。

  (1) PWM周波数= 10Hz・デューティ比= 1/100%で、RP2040-37pin- GPIO25pinに接続されたLED-D1(基板内部LED)を、ふんわり点灯させる。(調光制御の基本)
    @ ソースコード:pwm_basic_test.py

# utf-8の文字コードで書くことを宣言する。
# -*- coding: utf-8 -*-

# モジュールのインポート
from machine import Pin,PWM

# GPIO25ピンをPWM機能に設定
pwm= PWM(Pin(25))
# PWM周波数を10Hz(0.1秒)に設定(下限= 8Hz)
pwm.freq(10)
# デューティ比= 1%に設定
duty= 1
# デューティ比設定メソッド
pwm.duty_u16(int(65535*duty/100))

   A 実行結果
    ・自作オシロにて、デューティが正しく出ているか確認した。→ OKである。
    → D1のアノード側で確認



      デューティ= 1%
      PWM周波数= 10Hz(100mS)
     --------------------------
         ON時間= 1mS
        OFF時間= 99mS

 ・ビデオファイルです。
  こちらからどうぞ→ video002.mp4(147KB)


■ 2023.3.3
  (2) パルス幅変調調光(ランダム関数の応用)を用いて発光強度を変える。
    @ ソースコード:pwm_random_tyokou.py

# utf-8の文字コードで書くことを宣言する。
# -*- coding: utf-8 -*-

# モジュールのインポート
from machine import Pin,PWM
import utime,random

# GPIO25ピンをPWM機能に設定
pwm= PWM(Pin(25))
# PWM周波数を100Hz(10mS)に設定
pwm.freq(100)

while True:
# 乱数関数(0〜 1.0)
x= random.random()
# デューティ比設定メソッド(0〜 65535)
pwm.duty_u16(int(65535*x))
# 0.1秒待ち
utime.sleep(0.1)
# 変数xの値を確認。Thonnyのシェルに表示
print(x)

    A 実行結果:OK

 ・パルス幅変調調光のビデオファイルです。
  こちらからどうぞ→ video003.mp4(174KB)

 (3) ろうそく風 1/fゆらぎ発光(間欠カオス発光)
   @ ソースコード:pwm_chaos_fuzzy.py

# utf-8の文字コードで書くことを宣言する。
# -*- coding: utf-8 -*-

# モジュールのインポート
from machine import Pin,PWM
import utime,random

# GPIO25ピンをPWM機能に設定
pwm= PWM(Pin(25))
# PWM周波数を100Hz(10mS)に設定
pwm.freq(100)
# デューティ初期設定
x= 0.5

while True:
# xが5%以上、50%未満の場合のx演算
if 0.05 <= x < 0.5:
x= x+2*x*x
# xが50%以上、95%未満の場合のx演算
elif 0.5 <= x < 0.95:
x= x-2*(1-x)*(1-x)
# 5%以下、95%以上の時、乱数でxを決める。
else:
x= random.random()

# デューティ比設定メソッド(0〜 65535)
pwm.duty_u16(int(65535*x))
# 0.1秒待ち
utime.sleep(0.1)
# 変数xの値を確認。Thonnyのシェルに表示
print(x)

   A 実行結果:OK

 ・ろうそく風 1/fゆらぎ発光(間欠カオス発光)ビデオファイルです。
  こちらからどうぞ→ video004.mp4(358KB)


■ 2023.3.4
  ・ユニバーサルで作った、標準サイズ→ 細ピンサイズの変換基板であるが、未だ両サイドの
   削りが甘く出っ張りが多少多いので、これをブレッドボードに挿入した際、その出っ張りが
   ブレッドボード上の穴を隠してしまうのでピンを挿入する際、邪魔になる。
   そこでギリギリまで削った。


■ 2023.3.6〜 2023.3.7
  ブレッドボードのピンホール(板ばね接点)に外部LED等挿入して感触を掴みたい。
   まずはマルツサイトの記事(ラズパイPicoセミナの宣伝記事)を参考にして「4個のLEDを光らせる実験」
   を試してみたい。

  ・次の3つの参考ソースが載っていたので、まずは単純点灯の(1)- @から試してみる。
   ソースの解説は製品版のパスワードが無いと見れないのでソースから解読した。
   尚、ラズパイのGPIOの出力電流は、最大1ポート当たり16mAのようなので、LEDに流す電流を4mA・VF=2Vと
   設定して電流制限抵抗:390Ωを入れることにした。
   また、'1'でONしたいので、カソードGNDコモン接続にする。

  (1) 4個の外部LEDを点灯させる実験
    @ parallal_LED_1.py
      ・GPIO12〜 15に接続された4個の外部LEDを点灯させるだけの実験
    A parallal_LED_2.py
      ・GPIO12〜 15に接続された4個の外部LEDを、4bitバイナリーと見立て、
       0x0101パターンを表現('1':点灯・'0':消灯)し停止するだけの実験
    B parallal_LED_3.py
      ・Aを0.1秒ごとにシフトし繰返す実験

    (1)- @ parallal_LED_1.py

from machine import Pin

GPIO12 = Pin(12, Pin.OUT)
GPIO13 = Pin(13, Pin.OUT)
GPIO14 = Pin(14, Pin.OUT)
GPIO15 = Pin(15, Pin.OUT)

GPIO12.value(1)
GPIO13.value(1)
GPIO14.value(1)
GPIO15.value(1)

  ・ok



   led電流実測= 1.23v/390Ω= 3.2mA(Vh= 3.11v) 

  (1)- A parallal_LED_2.py

from machine import Pin

GPIO12 = Pin(12, Pin.OUT)
GPIO13 = Pin(13, Pin.OUT)
GPIO14 = Pin(14, Pin.OUT)
GPIO15 = Pin(15, Pin.OUT)

GPIOs = [GPIO12, GPIO13, GPIO14, GPIO15]

def led_4bit(data):
for gpio in GPIOs:
if (data & 0b0001) == 1:
gpio.value(1)
else:
gpio.value(0)
data = data >> 1

led_4bit(0b0101)

  ・ok

  (1)- B parallal_LED_3.py

from machine import Pin
import utime

GPIO12 = Pin(12, Pin.OUT)
GPIO13 = Pin(13, Pin.OUT)
GPIO14 = Pin(14, Pin.OUT)
GPIO15 = Pin(15, Pin.OUT)

GPIOs = [GPIO12, GPIO13, GPIO14, GPIO15]

def led_4bit(data):
for gpio in GPIOs:
if (data & 0b0001) == 1:
gpio.value(1)
else:
gpio.value(0)
data = data >> 1

delay = 0.1

while True:
led_4bit(0b0001)
utime.sleep(delay)
led_4bit(0b0010)
utime.sleep(delay)
led_4bit(0b0100)
utime.sleep(delay)
led_4bit(0b1000)
utime.sleep(delay)

  ・ok

  ・parallal_LED_3ビデオファイルです。
   こちらからどうぞ→ video005.mp4(206KB)


■ 2023.3.8
  (2) スイッチ入力の実験
    @ switch_1.py
     ・GPIO8 ← SW1接続
      GPIO9 ← SW2接続
      無限ループ内でSWを、0.2秒間隔で読込み、SWの状態をThonnyのシェルに表示

from machine import Pin
import utime

GPIO8 = Pin(8, Pin.IN, Pin.PULL_UP)
GPIO9 = Pin(9, Pin.IN, Pin.PULL_UP)

while True:
in1 = GPIO8.value()
in2 = GPIO9.value()

print( "------------------" )
print( "GPIO8: " + str(in1) )
print( "GPIO9: " + str(in2) )

utime.sleep(0.2)

  ・ok

    A switch_2.py
     ・SW1を押すと、右から左に順次シフト点灯(GPIO12-> GPIO13-> GPIO14-> GPIO15)し
      SW2を押すと、左から右に順次シフト点灯(GPIO15-> GPIO14-> GPIO13-> GPIO12)する。

from machine import Pin
import utime

GPIO8 = Pin(8, Pin.IN, Pin.PULL_UP)
GPIO9 = Pin(9, Pin.IN, Pin.PULL_UP)

GPIO12 = Pin(12, Pin.OUT)
GPIO13 = Pin(13, Pin.OUT)
GPIO14 = Pin(14, Pin.OUT)
GPIO15 = Pin(15, Pin.OUT)
GPIOs = [GPIO12, GPIO13, GPIO14, GPIO15]

def led_4bit(data):
for gpio in GPIOs:
if (data & 0b0001) == 1:
gpio.value(1)
else:
gpio.value(0)
data = data >> 1

delay = 0.05
while True:
in1 = GPIO8.value()
in2 = GPIO9.value()

if (in1==0) and (in2==1):
led_4bit(0b0001)
utime.sleep(delay)
led_4bit(0b0010)
utime.sleep(delay)
led_4bit(0b0100)
utime.sleep(delay)
led_4bit(0b1000)
utime.sleep(delay)

elif (in1==1) and (in2==0):
led_4bit(0b1000)
utime.sleep(delay)
led_4bit(0b0100)
utime.sleep(delay)
led_4bit(0b0010)
utime.sleep(delay)
led_4bit(0b0001)
utime.sleep(delay)

else:
led_4bit(0b0000)

  ・ok

  ・switch_2ビデオファイルです。  
   こちらからどうぞ→ video006.mp4(142KB): SW1 ON 左シフト
               video007.mp4(248KB) : SW2 ON 右シフト

  (3) ADCの実験
    @ adc_test.py
     <PicoのADC>
      ・分解能:12bit(0〜3.3Vを、0〜4095に変換)
      ・Vref= 3.3V(36pin:3v3(out)から供給)
      ・データ格納型形式:16bit(0〜65535)
   
     ・ADC0:31pinに、10kVR- center pinを接続
      3V3(OUT):36pinからの3.3Vを、10kVR- ccw pinに接続
      10kVR- cw pinを、gndに接続

      VRからの可変電圧をAD変換して、その入力電圧を換算し
      Thonnyのシェルに表示する。

from machine import ADC
import utime

ADC0 = ADC(0)

def get_voltage():
adc_value = ADC0.read_u16()
voltage = adc_value * 3.3 / 65535
return voltage

while True:
temp = get_voltage()
# print( str(temp) + " V" )
print('{:.2f}'.format(temp) + " V")
utime.sleep(0.5)

  ・ok


■ 2023.3.9
    A adc_test_chip_temperature.py
     ・RP2040内には、コアの温度を検知する温度センサーが組込まれているので、
      この出力電圧をAD変換して、その温度をThonnyのシェルに表示してみる。
      尚、内部でセンサー出力が接続されているのはCPUの、ADC(4)ピン。
      また温度に変換する式は「JH7UBCブログ」サイトに記載のものを使った。

from machine import ADC
import utime

ADC4 = ADC(4)

def get_voltage():
adc_value = ADC4.read_u16()
voltage = adc_value * 3.3 / 65535
return voltage

while True:
v = get_voltage()
temp = 27-(v-0.706)/0.001721
print('コア温度 = {:.1f}'.format(temp) + "℃")
utime.sleep(1)

  ・ok


■ 2023.3.10
  (4) タイマー割込みの実験
    @ timer_1.py
     ・タイマー割込み処理により、10mS毎にボード内部LEDをトグル(点滅)させる。(たぶんそういう動作するはず)
     → 実際LEDは、100mS(5Hz)毎にトグルしてた。
        調べると、タイマー初期設定の、freq=10は、コールバック関数(割込み処理関数):blink_LED(timer)を呼び出す
        周波数10Hz(周期=100mS)であるが、
        1回のフラッシュに2回のトグルが必要なため、10Hz でトグルすると 5Hz(200mS) で点滅するようだ。

from machine import Pin
from machine import Timer

GPIO25 = Pin(25, Pin.OUT)

def blink_LED(timer):
global GPIO25
GPIO25.toggle()

tim = Timer()

tim.init(freq=10, mode=Timer.PERIODIC, callback=blink_LED)

while True:
pass

・ok

  ・timer_1ビデオファイルです。
   こちらからどうぞ→ video008.mp4(209KB)   

    A timer_2.py
     ・タイマー割込み処理により、10mS毎に、10kVRによる可変電圧入力をチェックし、これに0.1を
      掛けた値を、外部の4個のLEDをシフト点灯させる個々の点灯間隔(遅延)にすることによって
      VRを回す毎にシフト点灯間隔がリアルに変化する。(たぶんそういう動作するはず)

from machine import Pin
from machine import ADC
from machine import Timer
import utime

delay = 0.1

ADC0 = ADC(0)

GPIO12 = Pin(12, Pin.OUT)
GPIO13 = Pin(13, Pin.OUT)
GPIO14 = Pin(14, Pin.OUT)
GPIO15 = Pin(15, Pin.OUT)
GPIOs = [GPIO12, GPIO13, GPIO14, GPIO15]

def led_4bit(data):
for gpio in GPIOs:
gpio.value( data & 1 )
data = data >> 1

def get_voltage():
adc_value = ADC0.read_u16()
voltage = adc_value * 3.3 / 65535
return voltage

def adc_check(timer):
global delay
delay = get_voltage() * 0.1

tim = Timer()
tim.init(freq=10, mode=Timer.PERIODIC, callback=adc_check)

while True:
led_4bit(0b0001)
utime.sleep(delay)
led_4bit(0b0010)
utime.sleep(delay)
led_4bit(0b0100)
utime.sleep(delay)
led_4bit(0b1000)
utime.sleep(delay)

  ・ok

  ・timer_2ビデオファイルです。
   こちらからどうぞ→ video009.mp4(1MB)


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