Serial communication I
视频教程27 - 串口通信发送数据:https://singtown.com/learn/50235/
视频教程28 - 串口通信接收数据:https://singtown.com/learn/50240/
Introduction
Why use serial?Because sometimes you need send information to other MCD,serial is simple and universal,basically every MCU has serial.
Serial TTL need three lines at least:TXD,RXD,GND,TXD is sending end,RXD is receiving terminal,and GND is ground wire.while linking,you need to connect RXD of OpenMV with other TXD of MCU,link TXD with RXD.As is shown in the picture.
import time
from pyb import UART
uart = UART(3, 19200)
while(True):
uart.write("Hello World!\r")
time.sleep_ms(1000)
Instantiate a serial3 of 19200 baud rate first and then transfer method write. Attention:it must be serial3,because OpenMV2 only export this serial,pyb has plenty of serials.OpenMV add serial1.
Transfer complex data
We talked about string json on the last section.
# Blob Detection and uart transport
import sensor, image, time
from pyb import UART
import json
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold = (65, 100, -10, 6, 24, 51)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
uart = UART(3, 115200)
while(True):
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([yellow_threshold])
if blobs:
print('sum :', len(blobs))
output_str = json.dumps(blobs)
for b in blobs:
# Draw a rect around the blob.
img.draw_rectangle(b.rect()) # rect
img.draw_cross(b.cx(), b.cy()) # cx, cy
print('you send:',output_str)
uart.write(output_str+'\n')
else:
print('not found!')
The results output is:
sum : 1
you send: [{x:17, y:23, w:37, h:12, pixels:178, cx:40, cy:29, rotation:3.060313, code:1, count:1}]
sum : 2
you send: [{x:34, y:24, w:19, h:13, pixels:149, cx:45, cy:30, rotation:3.120370, code:1, count:1}, {x:23, y:30, w:8, h:2, pixels:17, cx:27, cy:30, rotation:0.046378, code:1, count:1}]
That’s how sending all the blobs.
Simplify data
But sometimes you intend to not sending a bunch of data.For instance,I only want to transfer the central coordinate of color lump with the biggest area.You want to transfer what kind of data,you build what kind of data.
Compile a circle for,then compile a function find_max().
# Blob Detection and uart transport
import sensor, image, time
from pyb import UART
import json
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold = (65, 100, -10, 6, 24, 51)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
uart = UART(3, 115200)
def find_max(blobs):
max_size=0
for blob in blobs:
if blob.pixels() > max_size:
max_blob=blob
max_size = blob.pixels()
return max_blob
while(True):
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([yellow_threshold])
if blobs:
max_blob=find_max(blobs)
print('sum :', len(blobs))
img.draw_rectangle(max_blob.rect())
img.draw_cross(max_blob.cx(), max_blob.cy())
output_str="[%d,%d]" % (max_blob.cx(),max_blob.cy()) #方式1
#output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
print('you send:',output_str)
uart.write(output_str+'\r\n')
else:
print('not found!')
Result :
sum : 6
you send: [63,45]
sum : 2
you send: [60,50]
sum : 1
you send: [61,51]
In the code above:
output_str="[%d,%d]" % (max_blob.cx(),max_blob.cy()) #the first way
and
output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #the second way
has the same result. Because of simple structure,you can use string formatting function of python or exchanging function of json,both can do. In the result,even though find out a great many of color lump,only send the coordinate of the biggest color lump.