arduino_i2c_slave.py

# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# ArduinoをマスターデバイスとしOpenMV Camをスレーブとして使うI2C。
#
# OpenMV Camを次のようにArduinoに配線してください:
#
# OpenMV Cam Master I2C Data  (P5) - Arduino Uno Data  (A4)
# OpenMV Cam Master I2C Clock (P4) - Arduino Uno Clock (A5)
# OpenMV Cam Ground                - Arduino Ground

import pyb
import struct

text = "Hello World!\n"
data = struct.pack("<%ds" % len(text), text)
# 送信するデータパケットの構築には "struct" を使用します。
# "<" は構造体内のデータをリトルエンディアン順に配置します。
# "%ds" はデータストリームに文字列を配置します。例: "Hello World!\n"(13文字)の場合は "13s"。
# https://docs.python.org/3/library/struct.html を参照してください

# 必ずお読みください!!!
#
# 注意: OpenMV CamがI2Cマスターでない場合、"i2c.send()"を割り込みコールバック内で呼び出しても
# 以下のメインループ内で呼び出しても、I2Cスレーブとしてデータ送信への応答を
# 取りこぼすことがあります。これが発生すると、ArduinoはNAKを受け取り、
# OpenMV Camから再度読み取りを試みる必要があります。ArduinoとOpenMV CamのI2Cドライバは
# どちらもI2Cエラー発生後の復帰があまり得意ではないことに注意してください。OpenMV CamとArduinoでは、
# I2Cペリフェラルを一度解放してから再初期化することで復旧できます。

# OpenMV CamのハードウェアI2Cバスは常にI2Cバス2です。
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
bus.deinit()  # I2Cデバイスを完全にリセットします……
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
print("Waiting for Arduino...")

# 注意: 同期を正しく機能させるには、ArduinoがOpenMV Camにデータをポーリングし始める前に、
# OpenMV Camがこのスクリプトを実行している必要があります。そうしないとI2Cのバイトフレーミングが
# 崩れるなどの問題が起こります。そのため、OpenMV Camが「Waiting for Arduino...」の状態になるまでArduinoをリセット状態に保ってください。

while True:
    try:
        bus.send(
            struct.pack("<h", len(data)), timeout=10000
        )  # まず長さ(16ビット)を送信します。
        try:
            bus.send(data, timeout=10000)  # 次にデータを送信します。
            print("Sent Data!")  # エラーがない場合のみここに到達します。
        except OSError as err:
            pass  # エラーは気にしないのでpassします。
            # エラーは3種類あり得ることに注意してください。タイムアウトエラー、汎用エラー、または
            # ビジーエラーです。それぞれのエラーコードは "err.arg[0]" に対して116、5、16です。
    except OSError as err:
        pass  # エラーは気にしないのでpassします。
        # エラーは3種類あり得ることに注意してください。タイムアウトエラー、汎用エラー、または
        # ビジーエラーです。それぞれのエラーコードは "err.arg[0]" に対して116、5、16です。

###################################################################################################
# Arduinoコード
###################################################################################################
#
# #include <Wire.h>
# #define BAUD_RATE 19200
# #define CHAR_BUF 128
#
# void setup() {
#   Serial.begin(BAUD_RATE);
#   Wire.begin();
# delay(1000); // OpenMV Camの起動を待ちます。
# }
#
# void loop() {
#   int32_t temp = 0;
#   char buff[CHAR_BUF] = {0};
#
#   Wire.requestFrom(0x12, 2);
#   if(Wire.available() == 2) { // got length?
#
#     temp = Wire.read() | (Wire.read() << 8);
#     delay(1); // Give some setup time...
#
#     Wire.requestFrom(0x12, temp);
#     if(Wire.available() == temp) { // got full message?
#
#       temp = 0;
#       while(Wire.available()) buff[temp++] = Wire.read();
#
#     } else {
#       while(Wire.available()) Wire.read(); // Toss garbage bytes.
#     }
#   } else {
#     while(Wire.available()) Wire.read(); // Toss garbage bytes.
#   }
#
#   Serial.print(buff);
# delay(1); // ループが速くなりすぎないようにします。
# }

results matching ""

    No results matching ""