【學習筆記】OpenMV與arduino通訊
官網的教程是這樣的:http://book.openmv.cc/MCU/serial2.html
http://book.openmv.cc/example/02-Board-Control/arduino-i2c-slave.html
連線方式:
使用OpenMV IDE執行下面的程式:
# Arduino 作為I2C主裝置, OpenMV作為I2C從裝置。
#
# 請把OpenMV和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, ustruct
text = "Hello World!\n"
data = ustruct.pack("<%ds" % len(text), text)
# 使用 "ustruct" 來生成需要傳送的資料包
# "<" 把資料以小端序放進struct中
# "%ds" 把字串放進資料流,比如:"13s" 對應的 "Hello World!\n" (13 chars).
# 詳見 https://docs.python.org/3/library/struct.html
# READ ME!!!
#
# 請理解,當您的OpenMV攝像頭不是I2C主裝置,所以不管是使用中斷回撥,
# 還是下方的輪循,都可能會錯過響應傳送資料給主機。當這種情況發生時,
# Arduino會獲得NAK,並且不得不從OpenMV再次讀資料。請注意,
# OpenMV和Arduino都不擅長解決I2C的錯誤。在OpenMV和Arduino中,
# 你可以通過釋放I2C外設,再重新初始化外設,來恢復功能。
# OpenMV上的硬體I2C匯流排都是2
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
bus.deinit() # 完全關閉裝置
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
print("Waiting for Arduino...")
# 請注意,為了正常同步工作,OpenMV Cam必須 在Arduino輪詢資料之前執行此指令碼。
# 否則,I2C位元組幀會變得亂七八糟。所以,保持Arduino在reset狀態,
# 直到OpenMV顯示“Waiting for Arduino...”。
while(True):
try:
bus.send(ustruct.pack("<h", len(data)), timeout=10000) # 首先傳送長度 (16-bits).
try:
bus.send(data, timeout=10000) # 然後傳送資料
print("Sent Data!") # 沒有遇到錯誤時,會顯示
except OSError as err:
pass # 不用擔心遇到錯誤,會跳過
# 請注意,有3個可能的錯誤。 超時錯誤(timeout error),
# 通用錯誤(general purpose error)或繁忙錯誤
#(busy error)。 “err.arg[0]”的錯誤程式碼分別
# 為116,5,16。
except OSError as err:
pass # 不用擔心遇到錯誤,會跳過
# 請注意,有3個可能的錯誤。 超時錯誤(timeout error),
# 通用錯誤(general purpose error)或繁忙錯誤
#(busy error)。 “err.arg[0]”的錯誤程式碼分別
# 為116,5,16。
用Arduino執行以下程式:
// Arduino Code
include <Wire.h>
#define BAUD_RATE 19200
#define CHAR_BUF 128
void setup() {
Serial.begin(BAUD_RATE);
Wire.begin();
delay(1000); // 給OpenMV一個啟動的時間
}
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); // Don't loop to quickly.
}
插播一波,如果感興趣的童鞋們可以加入技術交流群~
相關文章
- Arduino學習筆記13UI筆記
- Openmv 與 Stm32f407通訊
- “React元件間通訊”學習筆記React元件筆記
- 《通訊原理基礎》學習筆記(1)筆記
- 程式間通訊(linux程式與執行緒學習筆記)Linux執行緒筆記
- Adaptive AUTOSAR 學習筆記 12 - 通訊管理APT筆記
- 3|程式間通訊--有名管道學習筆記筆記
- python學習筆記--web即時通訊Python筆記Web
- Android學習筆記之藍芽通訊...Android筆記藍芽
- CANopen學習筆記(二)通訊物件PDO和SDO等筆記物件
- Arduino 學習UI
- NFC:Arduino、Android與PhoneGap近場通訊UIAndroid
- 工作筆記——CPLD與MCU通過SPI通訊筆記
- Android學習筆記--基於XMPP的即時通訊Android筆記
- Android程式間通訊(複習筆記)Android筆記
- 音視訊學習筆記(一)筆記
- 學習筆記(2):go輕量級分散式與微服務-實現程式的訊號通訊2筆記Go分散式微服務
- PMP學習筆記-溝通管理(轉)筆記
- 開通個人學習隨筆記錄筆記
- 逆向與安全學習筆記筆記
- 【學習筆記】mvc與mvvm筆記MVCMVVM
- Adnroid原始碼學習筆記:Handler 執行緒間通訊原始碼筆記執行緒
- Linux程式執行緒學習筆記:程式間通訊 之 管道Linux執行緒筆記
- HTML5學習筆記 音訊HTML筆記音訊
- HTML5學習筆記 視訊HTML筆記
- QT學習筆記1(安裝、建立和訊號與槽)QT筆記
- Nginx 學習筆記--程式與模組Nginx筆記
- MySQL與MariaDB學習筆記MySql筆記
- JDBC與JavaBean學習筆記(二)JDBCJavaBean筆記
- Java學習筆記--sql與javaJava筆記SQL
- SAP學習筆記--整合與核算筆記
- JVM狂神說視訊學習筆記JVM筆記
- numpy的學習筆記\pandas學習筆記筆記
- IIC通訊協議筆記協議筆記
- SPI通訊協議筆記協議筆記
- xss-labs 通關學習筆記筆記
- Java學習筆記-------使用DataOutputStream 、DataInputStream 組合實現C/S通訊 :例項Java筆記AI
- 深度學習與神經網路學習筆記一深度學習神經網路筆記