MicroPythonで遊ぶ (5) - SDカードシールド(SDカード)
SDカードへライトしてみます。
RTC同様にSDカードドライバをインポートすることで簡単にライトできました。
SDCardクラスのコンストラクタに、I/FのSPI1とCSのPB6を指定します。
from machine import SPI import pyb, sdcard, os sd = sdcard.SDCard(SPI(1), pyb.Pin('PB6')) pyb.mount(sd, '/sd') file = open('/sd/test.txt', 'w') file.write('test 001\n') file.write('test 002\n') file.write('test 003\n') file.write('test 004\n') file.write('test 005\n') file.close() print("Pass")
PCで確認するとライトできていました。
なお、ファイルへ追記するにはopen関数の第二引数を 'a' にします。
MicroPythonで遊ぶ (4) - SDカードシールド(RTC)
Arduino用のSDカードシールドをMicroPythonで使ってみようと思います。
Amazonで購入しました。
https://www.amazon.co.jp/dp/B07GDZ9XLN/
ボードは NUCLEO-F446RE を使用しています。
Arduino互換のピン配置なのでピッタリ収まります。
SDカードへアクセスする前にRTCを動かしてみます。
RTCクラスをインポートして簡単に表示できました。
from machine import RTC import utime rtc = RTC() while True: dt = rtc.datetime() print(dt) utime.sleep_ms(1000)
何も設定していないのに現在時刻・・。
PCの現在時刻を変更したらRTCの時刻も変更されました。
この辺がどういう仕組みなのかは良くわかっていませんが、シールド上のIC「DS1307」を使用しているわけでは無いようです。
秋月電子にあるデータシートから調べるとDS1307へアクセスするI2CのSCL, SDAは、F446REのPC0, PC1に接続されていました。
DS1307用のライブラリをダウンロードしてインストールします。
https://github.com/mcauser/micropython-tinyrtc-i2c
200ミリ毎にDS1307から時刻を読み取りOLEDへ表示してみました。
F446REのPC0, PC1はI2C用のピンでは無いので、SoftI2Cを使ってDS1307へアクセスしています。
from machine import I2C, SoftI2C, RTC import ds1307 import ssd1306 import utime i2c_oled = I2C(1, freq=100000) # Ch.1 SCL=PB8, SDA=PB9 i2c_rtc = SoftI2C(scl='PC0', sda='PC1', freq=100000) display = ssd1306.SSD1306_I2C(128, 64, i2c_oled) display.init_display() display.write_cmd(0xa0) # 上下通常 display.write_cmd(0xc0) # 左右通常 rtc = RTC() dt = rtc.datetime() rtc = ds1307.DS1307(i2c_rtc) rtc.datetime(dt) while True: display.fill(0) dt = rtc.datetime() p0 = "{:d}/{:d}/{:d}".format(dt[0], dt[1], dt[2]) p1 = "{:02d}:{:02d}:{:02d}".format(dt[4], dt[5], dt[6]) display.text(p0, 0, 0, True) display.text(p1, 16, 10, True) display.show() utime.sleep_ms(200)
下記のコードでPCの時刻を読み取り、DS1307へ設定しています。
rtc = RTC() dt = rtc.datetime() rtc = ds1307.DS1307(i2c_rtc) rtc.datetime(dt)
正しく表示できました。
スタンドアロンでも試してみます。
DS1307への書き込みをコメントアウトして、main.pyへ上記のコードを貼り付けて保存します。
rtc = RTC()
dt = rtc.datetime()
rtc = ds1307.DS1307(i2c_rtc)
#rtc.datetime(dt)
バックアップ電池(CR1220)をセットしているので、PCと切断してUSB電源に繋ぐと現在時刻が表示されました。
MicroPythonで遊ぶ (3) - ADT7410 & SHT35
MicroPythonからI2C接続の2つの温度センサーを動かしてみました。
ボードは NUCLEO-F446RE を使用しています。
2つの温度センサーは秋月電子で購入したADT7410とSHT35です。
- ADT7410(600円)
- 16Bit、One-Shot Modeで動作させています。
from machine import I2C import utime i2c = I2C(1, freq=100000) # Ch.1 SCL=PB8, SDA=PB9 dev_addr = i2c.scan() addr = dev_addr[0] print("Addr:" + hex(addr)) wd = bytearray([0x03, 0b10100000]) # Configuration Register: 16bit one-shot while True: i2c.writeto(addr, wd) utime.sleep_ms(1000) rd = i2c.readfrom_mem(addr, 0x00, 2) tmp = (rd[0] << 8) | rd[1] if (tmp & 0x8000)==0x8000: tmp = (tmp - 65536) / 128 else: tmp = tmp / 128 print("{:.3f}".format(tmp))
from machine import I2C import utime def crc8(data): init = 0x31 crc = 0xff for i in range(2): crc ^= data[i] for j in range(8): if(crc & 0x80): crc = (crc << 1) ^ init else: crc = (crc << 1) crc &= 0xff return crc i2c = I2C(1, freq=100000) # Ch.1 SCL=PB8, SDA=PB9 dev_addr = i2c.scan() addr = dev_addr[0] print("Addr:" + hex(addr)) wd = bytearray([0x2C, 0x06]) while True: i2c.writeto(addr, wd) utime.sleep_ms(300) rd = i2c.readfrom(addr, 6) tmp = -45 + 175 * (((rd[0] << 8) | rd[1]) / 65535) hum = 100 * ((rd[3] << 8) | rd[4]) / 65535 crc_tmp = crc8([rd[0], rd[1]]) crc_hum = crc8([rd[3], rd[4]]) if crc_tmp==rd[2] and crc_hum==rd[5]: cc = '' else: cc = '[CRC Fail]' print("{:.3f} {:.3f} {:s}".format(tmp, hum, cc)) utime.sleep_ms(1000)
2つ同時に測定してみました。
from machine import I2C import utime def get_adt7410(): addr = 0x48 wd = bytearray([0x03, 0b10100000]) i2c.writeto(addr, wd) utime.sleep_ms(1000) rd = i2c.readfrom_mem(addr, 0x00, 2) tmp = (rd[0] << 8) | rd[1] if (tmp & 0x8000)==0x8000: tmp = (tmp - 65536) / 128 else: tmp = tmp / 128 return(tmp) def get_sht35(): addr = 0x45 wd = bytearray([0x2C, 0x06]) i2c.writeto(addr, wd) utime.sleep_ms(300) rd = i2c.readfrom(addr, 6) tmp = -45 + 175 * (((rd[0] << 8) | rd[1]) / 65535) return(tmp) i2c = I2C(1, freq=100000) # Ch.1 SCL=PB8, SDA=PB9 while True: tmp_adt7410 = get_adt7410() tmp_sht35 = get_sht35() print("{:.3f} {:.3f}".format(tmp_adt7410, tmp_sht35)) utime.sleep_ms(1000)
左がADT7410、右がSHT35の結果です。
ほぼ同じ結果となりました。
MicroPythonで遊ぶ (2) - SSD1306
MicroPythonからI2C接続のOLEDを動かしてみました。
ボードは NUCLEO-F446RE を使用しています。
- MicroPythonのサイトからソースコードをダウンロードして解凍
- https://micropython.org/download/
- (記事作成時点では micropython-1.19.1.zip が最新でした)
- ボード内にlibディレクトリが無い時はThonnyから作成
- ssd1306.pyをlibディレクトリへインストール
- フレームバッファクラスのドキュメントを参考にメソッドを使用して描画を行います。
from machine import I2C import ssd1306 i2c = I2C(1, freq=100000) # Ch.1 SCL=PB8, SDA=PB9 addr = i2c.scan() display = ssd1306.SSD1306_I2C(128, 64, i2c) display.init_display() display.write_cmd(0xa0) # 上下通常 display.write_cmd(0xc0) # 左右通常 display.text('LSI Jiu-Jitsu', 10, 14, True) display.rect(0, 4, 128, 28, True) display.rect(4, 8, 120, 20, True) display.text('Addr:' + hex(addr[0]), 56, 56, True) display.show()
SSD1306へコマンド送信を行うにはssd1306.pyのwrite_cmdメソッドを使用します。
[参考記事]
MicroPythonで遊ぶ (1) - F446RE
Pythonをキチンと勉強しようと思い立ちました。
そこで、組み込みに特化したMicroPythonを使ってみようと考えたところ、タイミング良くインターフェースで記事が特集されていました。
手持ちのNUCLEO-F446REボードのセットアップ手順も書かれていたので、さっそく記事を参考にセットアップとLEDチカチカを試してみました。
- PCとF446REを接続
- MicroPythonのダウンロードサイトからF446RE向けファームウェア(.hex)をダウンロード
- https://micropython.org/download/NUCLEO_F446RE/
- (記事作成時点では v.1.19.1 が最新でした)
- ST-Link utilityをダウンロードしてインストール
- https://www.st.com/ja/development-tools/stsw-link004.html
- (ダウンロードには氏名、メールアドレス登録が必要です)
- STM32 ST-LINK Utilityを起動してメニューの「Target」から「Connect」で接続
- (接続エラーが発生する時は「Target」→「Settings」のSWD Frequencyを下げると安定する場合があるようです)
- 「Target」→「Program」からMicroPythonのファームウェアを開いて「Start」をクリックして書き込み開始
- Python開発環境のThonnyをダウンロードしてインストール → 起動
こちらのコードを実行すると0.5秒単位でF446RE上のLD2が点滅します。
from machine import Pin import utime led = Pin('PA5', Pin.OUT_PP) while True: led.value(1) utime.sleep_ms(500) led.value(0) utime.sleep_ms(500)
【柔術】2022年の大会出場
2022年は2大会に出場しました。
1大会目は7月2日(土)に錦糸町の墨田区総合体育館で行われた
ASJJF - TOKYO SUMMER JIU JITSU CHAMPIONSHIP 2022
です。
早めに申し込んだところ、後からなんと!
同日に近所でJBJJF全日本ノーギが開催されることになり、道場の皆さんはそちらに出場することに・・。
こちらの大会はワタクシだけの出場となりました。
セコンドも撮影係りも無し。
と言うことで急遽、娘に撮影をお願いすることにしました(笑)
減量無しの1つ上の階級で出場し、3人トーナメントでした。
約7ケ月ぶりなのと、娘の前での試合は緊張しましたが、なんとか2勝して金メダル。
娘へのバイト代は色を付けて、そして、帰りは2人で焼肉祝勝会でした(笑)
嬉しい優勝。
2大会目は10月2日(日)に横浜武道館で開催された
JBJJF - ヒカルド・デラヒーバ杯2022
です。
道場からは多くの参加者で団体優勝を目指して頑張りました。
今回も減量無しの1つ上の階級で出場し8人トーナメントでした。
優勝までは3勝の山です。
初戦、準決勝は順当に勝ち上がれ、久しぶりの3戦目。
疲労感からか気持ちの弱さが出てしまい、守り一辺倒から攻めに転じられずにアドバン差で負けてしまいました。
悔いの残る敗戦。
団体表彰にも入れませんでした。
2023年は2月末の全日本マスターへエントリーしました。
4年ぶりに参加する全日本マスター。
コロナ収束(?)と巷で噂される影響なのか、1次締切の段階で物凄いエントリー数でした。
減量しながらの本来の階級での出場です。
優勝して次の帯へ進みたいですなぁ。
頑張ります。
AliExpressで電圧計と電流計を購入
ソーラーシステムの電力状態を可視化するためにメーターを設置しようと思います。
デジタルメーターでは電力を消費してしまうので、低消費電力のアナログメーターにしようと思うのですが、意外と高いのでAliExpressで注文しました。
AliExpressは以前OLEDを注文した以来の2回目です。
注文したのはこちらのお店です。
国内で買うと1つ1,000円ほどするので、驚異的な安さでした。
ただ、注文してから到着までに40日ほどかかりましたけど(笑)
届かないんじゃ無いかと心配になったところでようやくの到着です。
しっかりとした梱包で、緩衝材の中に段ボールが入っており、二重の梱包でした。
8個注文したので隙間なく入っていました。
電圧計15Vと20V
電流計1Aと2A
それぞれ2個づつ注文しました。
新品だと思うのですけど、うっすらと擦り傷もあったりと。
写真ではわかりずらいですが。
安いから良いけど(笑)
9V電池で電圧計の動作確認をしてみました。
全て正常に9Vを指していました。
電流は太陽光LEDを2つ点灯して約370mAで試しました。
4つ中、3つはほぼ近似値を指していました。
1つだけ280mA・・(笑)
まぁ、こんなことがあるかな、と思ったので2個づつ注文しておいて良かったです。
金額は送料込みで2,531円でした。
部品も揃ったので、メーター付きのソーラーコントローラーボックスの制作に取り掛かろうと思います。