【學習筆記】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通訊
- 程式間通訊(linux程式與執行緒學習筆記)Linux執行緒筆記
- 《通訊原理基礎》學習筆記(1)筆記
- Adaptive AUTOSAR 學習筆記 12 - 通訊管理APT筆記
- 3|程式間通訊--有名管道學習筆記筆記
- Android學習筆記--基於XMPP的即時通訊Android筆記
- CANopen學習筆記(二)通訊物件PDO和SDO等筆記物件
- 工作筆記——CPLD與MCU通過SPI通訊筆記
- Android程式間通訊(複習筆記)Android筆記
- Adnroid原始碼學習筆記:Handler 執行緒間通訊原始碼筆記執行緒
- xss-labs 通關學習筆記筆記
- 逆向與安全學習筆記筆記
- 【學習筆記】mvc與mvvm筆記MVCMVVM
- 學習筆記(2):go輕量級分散式與微服務-實現程式的訊號通訊2筆記Go分散式微服務
- 開通個人學習隨筆記錄筆記
- JDBC與JavaBean學習筆記(二)JDBCJavaBean筆記
- Linux與DNS的學習筆記LinuxDNS筆記
- QT學習筆記1(安裝、建立和訊號與槽)QT筆記
- numpy的學習筆記\pandas學習筆記筆記
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- Ansible學習筆記——基礎與配置筆記
- 【學習筆記】Spring與Junit的整合筆記Spring
- Nginx 學習筆記--程式與模組Nginx筆記
- 期望 與 機率論 學習筆記筆記
- MySQL學習筆記——建立與約束MySql筆記
- Java註解與反射學習筆記Java反射筆記
- 資訊理論理論學習筆記筆記
- JVM狂神說視訊學習筆記JVM筆記
- SPI通訊協議筆記協議筆記
- IIC通訊協議筆記協議筆記
- 學習筆記筆記
- 醫學資訊學(1)——複習筆記提綱筆記
- 醫學資訊學(2)——複習筆記提綱筆記
- 醫學資訊學(3)——複習筆記提綱筆記
- RT-Thread學習筆記3-執行緒間通訊 & 定時器thread筆記執行緒定時器
- STM32F103學習筆記(6)——CAN通訊(下)—— 過濾器配置筆記過濾器
- Neo4j/cypher學習筆記與學習建議筆記