2024 年度 組込システム (J5)

はじめに

本科目では ESP32 マイコンを用いて以下を目的とした演習を行う.

  • 比較的低級な C 言語から, 高級言語 (python, ruby) までの各種言語を用いたプログラミングを修得する.
    • ESP32 の公式な開発環境は C 言語.
  • 高級言語でのマイコンプログラミングの実際を理解する.
    • 呼び出し元の言語に応じたラッパーを作成し, ラッパーを経由して C 言語ライブラリを使用する.
  • マイコン周辺機器 (peripheral) のデータシートを (多少なりとも) 読み, それをプログラミングできるようになる.

解説

教材

教育ボード

本ドキュメントでは ESP32 マイコンを搭載した教育ボードを対象とする.


パーツPin など
LEDGPIO13, 12, 14, 27, 26, 25, 33, 32
スイッチGPIO34, 35, 18, 19
サーミスタ温度計GPIO39 (ADC1_CH3)
圧電ブザーGPIO15
GPS (GYSFDMAXB)GPIO16 (TX), GPIO17 (RX) (電源 GPIO5)
LCD (AQM0802A-RN-GBW)I2C (SDA: GPIO21, SCL: GPIO22, アドレス: 0x3E)
RTC (RC-8035SA)I2C (SDA: GPIO21, SCL: GPIO22, アドレス: 0x32) (電源 GPIO4)
SD cardSPI (MOSI: GPIO23, MISO: GPIO19, SCK: GPIO18, CS: GPIO2)
SHT75COM1: GPIO25,26, COM2: GPIO32,33 [LED と共有]

2 代目以降の基板は GPS と RTC の電源を切れるようになっている. GPS と RTC の電源を入れる時は以下のような命令が必要となる.

# GPS の電源を入れる                                                                                       
gps_pw = GPIO.new(5, GPIO::OUT)
gps_pw.write(0)
sleep 1

# RTC の電源を入れる
gps_pw = GPIO.new(4, GPIO::OUT)
gps_pw.write(0)
sleep 1

USB-Linux

USB ブートの Linux (Debian 11) を利用する. 演習ではイメージファイル (<URL:j5_es2023.img> 29GB) の書き込まれた USB メモリ (SanDisk SDCZ73-032G-G46 [32GB]) を用いる.

USB メモリから Linux をブートするためには, 利用する PC の BIOS で以下を設定を行う必要がある.

  • BIOS のタイプ: UEFI (legacy では起動しない)
  • SecureBoot: 無効
  • Boot: USB メモリの優先順位を上げる.

ログインするための情報は以下の通りである.

  • user, live

演習

各種開発環境を用いたプログラミングの基礎

[1] mruby/c



[2] MicroPython


[3] Arduino IDE + ESP32ボードマネージャ


[4] ESP-IDF 環境 + C 言語

mruby/c で IoT (1)

mruby/c で LCD (I2C)wifiGPS (UART) を扱う方法について理解した後,以下の課題を行うこと.

課題

  • 定期的に GPS による位置計測を行い,GPS から得られた日付・時刻・緯度・経度を液晶ディスプレイに表示せよ.
  • 次に,得られた日付・時刻・緯度・経度をサーバに送り,移動経路を地図上にプロットせよ.wifi に接続できる場所 (演習室) に戻ってから,蓄積した位置データをサーバへ送信して可視化せよ.適当に校内を歩いてくると良い.
    • 具体的には,無線 LAN に接続していないときは配列にデータ保管,無線 LAN に接続しているときは配列に蓄積されたデータをサーバ送信,とせよ.
    • 送信の時間間隔は自分で決めて良いが短くしすぎるとメモリに収まりきらなくなることに注意せよ
    • 時刻は GPS で取得した値を用いること
  • 作成したプログラムと,地図上にプロットした移動経路のスナップショットを提出すること.
  • 地図上にプロットするためのサーバは教員側で用意する.その使い方については講義の際に紹介する.

参考:leaflet + geoJson で地図プロット (2021年度資料より)

mruby/c で IoT (2)

課題:温度の計測を行い,その結果を1分間隔 (毎 0 秒) でサーバに送信するプログラムを作成せよ.

mruby/c でクラス定義 (C と Ruby の連携)

I2C センサのデータシートを読む

演習の進め方.

  • 数名でチームを組み,利用するセンサを選ぶ.選択後,試しに Arduino からセンサを使ってみよ.
  • mruby/c のサンプルコードを読み,それぞれのメソッド (or 各行) とデータシートの内容とを対応づけする.(注: サンプルコードにバグが含まれている可能性あり.全ての機能が実装されているわけでない.また,昨年度と今年度で I2C のメソッドが変更されていることに注意).
  • 対応づけができたら,プログラムに註釈を入れ,データシートからプログラム作成に必要な部分を抜き出す.必要に応じてデバッグ・機能追加すること.
  • mruby/c のセンサ用ソースコードを用いて,実際にセンサを動かしてみる.
  • mruby/c のコードを GitHub に commit する.
  • チーム毎に,理解したこと/デバッグ・機能追加の結果,を発表する.

資料:

[参考] mruby/c

[参考] 教材準備

ブート可能な USB-Linux のセットアップや, 各開発環境のセットアップ方法を以下にまとめる.

演習で使う Live-USB の img ファイルは <URL:j5_es2022.img> (29GB) である. これを USB に焼き, しかるべく PC の bios (UEFI) を設定すれば演習環境を再現できる. なお, img ファイルを USB メモリに焼くには Linux の dd コマンドや Etcher など使うと良い.

謝辞