“MicroMV IIC通信”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
第2行: 第2行:
  
 
*'''做为IIC主机'''
 
*'''做为IIC主机'''
扫描设备地址
+
:扫描设备地址
 
:<source lang="py">
 
:<source lang="py">
 
from pyb import I2C
 
from pyb import I2C
第12行: 第12行:
 
[[File:microMVIIC1.png||600px|center]]
 
[[File:microMVIIC1.png||600px|center]]
  
 +
 +
*'''做为IIC从机'''
 +
:扫描设备地址
 +
:<source lang="py">
 +
# I2C with the Arduino as the master device and the OpenMV Cam as the slave.
 +
#
 +
# Please wire up your OpenMV Cam to your Arduino like this:
 +
#
 +
# 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)
 +
# Use "ustruct" to build data packets to send.
 +
# "<" puts the data in the struct in little endian order.
 +
# "%ds" puts a string in the data stream. E.g. "13s" for "Hello World!\n" (13 chars).
 +
# See https://docs.python.org/3/library/struct.html
 +
 +
# READ ME!!!
 +
#
 +
# Please understand that when your OpenMV Cam is not the I2C master it may miss responding to
 +
# sending data as a I2C slave no matter if you call "i2c.send()" in an interupt callback or in the
 +
# main loop below. When this happens the Arduino will get a NAK and have to try reading from the
 +
# OpenMV Cam again. Note that both the Arduino and OpenMV Cam I2C drivers are not good at getting
 +
# unstuck after encountering any I2C errors. On the OpenMV Cam and Arduino you can recover by
 +
# de-initing and then re-initing the I2C peripherals.
 +
 +
# The hardware I2C bus for your OpenMV Cam is always I2C bus 2.
 +
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
 +
bus.deinit() # Fully reset I2C device...
 +
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
 +
print("Waiting for Arduino...")
 +
while(True):
 +
    try:
 +
        bus.send(ustruct.pack("<h", len(data)), timeout=10000) # Send the len first (16-bits).
 +
        try:
 +
            bus.send(data, timeout=10000) # Send the data second.
 +
            print("Sent Data!") # Only reached on no error.
 +
        except OSError as err:
 +
            pass # Don't care about errors - so pass.
 +
            # Note that there are 3 possible errors. A timeout error, a general purpose error, or
 +
            # a busy error. The error codes are 116, 5, 16 respectively for "err.arg[0]".
 +
    except OSError as err:
 +
        pass # Don't care about errors - so pass.
 +
        # Note that there are 3 possible errors. A timeout error, a general purpose error, or
 +
        # a busy error. The error codes are 116, 5, 16 respectively for "err.arg[0]".
 +
 +
###################################################################################################
 +
# Arduino Code
 +
###################################################################################################
 +
#
 +
# #include <Wire.h>
 +
# #define BAUD_RATE 19200
 +
# #define CHAR_BUF 128
 +
#
 +
# void setup() {
 +
#  Serial.begin(BAUD_RATE);
 +
#  Wire.begin();
 +
#  delay(1000); // Give the OpenMV Cam time to bootup.
 +
# }
 +
#
 +
# 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.
 +
# }
 +
</source>
  
 
[[MicroMV目录|返回MicroMV目录页面]]
 
[[MicroMV目录|返回MicroMV目录页面]]

2018年5月15日 (二) 05:46的版本

MicroMV上的IIC通讯

  • 做为IIC主机
扫描设备地址
from pyb import I2C
i2c = I2C(2, I2C.MASTER) # The i2c bus must always be 2.
address=i2c.scan()
for addr in address:
    print ("Hex = 0x%2x" % (addr))
MicroMVIIC1.png


  • 做为IIC从机
扫描设备地址
# I2C with the Arduino as the master device and the OpenMV Cam as the slave.
#
# Please wire up your OpenMV Cam to your Arduino like this:
#
# 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)
# Use "ustruct" to build data packets to send.
# "<" puts the data in the struct in little endian order.
# "%ds" puts a string in the data stream. E.g. "13s" for "Hello World!\n" (13 chars).
# See https://docs.python.org/3/library/struct.html

# READ ME!!!
#
# Please understand that when your OpenMV Cam is not the I2C master it may miss responding to
# sending data as a I2C slave no matter if you call "i2c.send()" in an interupt callback or in the
# main loop below. When this happens the Arduino will get a NAK and have to try reading from the
# OpenMV Cam again. Note that both the Arduino and OpenMV Cam I2C drivers are not good at getting
# unstuck after encountering any I2C errors. On the OpenMV Cam and Arduino you can recover by
# de-initing and then re-initing the I2C peripherals.

# The hardware I2C bus for your OpenMV Cam is always I2C bus 2.
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
bus.deinit() # Fully reset I2C device...
bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)
print("Waiting for Arduino...")
while(True):
    try:
        bus.send(ustruct.pack("<h", len(data)), timeout=10000) # Send the len first (16-bits).
        try:
            bus.send(data, timeout=10000) # Send the data second.
            print("Sent Data!") # Only reached on no error.
        except OSError as err:
            pass # Don't care about errors - so pass.
            # Note that there are 3 possible errors. A timeout error, a general purpose error, or
            # a busy error. The error codes are 116, 5, 16 respectively for "err.arg[0]".
    except OSError as err:
        pass # Don't care about errors - so pass.
        # Note that there are 3 possible errors. A timeout error, a general purpose error, or
        # a busy error. The error codes are 116, 5, 16 respectively for "err.arg[0]".

###################################################################################################
# Arduino Code
###################################################################################################
#
# #include <Wire.h>
# #define BAUD_RATE 19200
# #define CHAR_BUF 128
#
# void setup() {
#   Serial.begin(BAUD_RATE);
#   Wire.begin();
#   delay(1000); // Give the OpenMV Cam time to bootup.
# }
#
# 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.
# }

返回MicroMV目录页面