LSI Jiu-Jitsu

電子工作とブラジリアン柔術

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つの温度センサーは秋月電子で購入したADT7410SHT35です。

  • 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))


  • SHT35(1,380円)
    • リード方法は秋月電子の商品ページのサンプルスケッチを参考にしました。
    • 温度と湿度を表示しています。
    • CRC結果が不一致の際はエラーメッセージを表示します。

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 を使用しています。




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を接続
  • STM32 ST-LINK Utilityを起動してメニューの「Target」から「Connect」で接続
    • (接続エラーが発生する時は「Target」→「Settings」のSWD Frequencyを下げると安定する場合があるようです)
  • 「Target」→「Program」からMicroPythonのファームウェアを開いて「Start」をクリックして書き込み開始

こちらのコードを実行すると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年の大会出場

f:id:mohran:20230131220550j:image

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回目です。

f:id:mohran:20220403010427j:plain:w320

注文したのはこちらのお店です。

国内で買うと1つ1,000円ほどするので、驚異的な安さでした。
ただ、注文してから到着までに40日ほどかかりましたけど(笑)
届かないんじゃ無いかと心配になったところでようやくの到着です。
f:id:mohran:20220403010439j:plain:w320

しっかりとした梱包で、緩衝材の中に段ボールが入っており、二重の梱包でした。
f:id:mohran:20220403010446j:plain:w320

8個注文したので隙間なく入っていました。
f:id:mohran:20220403010454j:plain:w320

電圧計15Vと20V
電流計1Aと2A
それぞれ2個づつ注文しました。
f:id:mohran:20220403010502j:plain:w320

新品だと思うのですけど、うっすらと擦り傷もあったりと。
写真ではわかりずらいですが。
安いから良いけど(笑)
f:id:mohran:20220403010508j:plain:w320

9V電池で電圧計の動作確認をしてみました。
全て正常に9Vを指していました。
f:id:mohran:20220403010518j:plain:w320

電流は太陽光LEDを2つ点灯して約370mAで試しました。
f:id:mohran:20220403010525j:plain:w320

4つ中、3つはほぼ近似値を指していました。
f:id:mohran:20220403010532j:plain:w320

1つだけ280mA・・(笑)
f:id:mohran:20220403010539j:plain:w320

まぁ、こんなことがあるかな、と思ったので2個づつ注文しておいて良かったです。
金額は送料込みで2,531円でした。
部品も揃ったので、メーター付きのソーラーコントローラーボックスの制作に取り掛かろうと思います。