通信测试
先用网线连接两台树莓派,然后通过ifconfig命令查看双方对应的eth0端口号。
169 可以看到接受机对应的eth0 ip为169.254.9.212。
然后写出接收机的python代码。
import socket
import time
import struct
HOST = '169.254.9.212'
PORT = 8888
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind((HOST,PORT))
while True:
data,address = sock.recvfrom(1024)
print(struct.unpack('i',data))
sock.close()
上面的PORT可以自己取,但是要保证接收机与发送机的PORT一致。
下面是发送机的代码:
import socket
import struct
HOST = '169.254.9.212'
PORT = 8888
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.connect((HOST,PORT))
while True:
sock.sendall(struct.pack('i',1))
sock.close()
注意,发送机的HOST要填写接收机的eth0 ip,也就是169.254.9.212。
然后运行代码,可以看到通信成功。
简单应用
接收机通过连接PCA9685去控制二维舵机,舵机的角度信号由发送机发出。
如果发送float类型的数据,则需要改上述代码pack和unpack函数里面的'i',将其变为'f',如果要发松两个数字,则改为'ff'。
不同类型数据的对应表如下所示。
下面是发送机的代码。
import socket
import struct
import time
HOST = '169.254.9.212'
PORT = 8888
sock = socket.socket(socket.AF_INET,socker.SOCK_DGRAM)
sock.connect((HOST,PORT))
a1 = 90
a2 = 90
flag1 = 1
flag2 = 1
step = 0.1
while True:
sock.sendall(struct.pack('ff',a1,a2))
time.sleep(0.01)
if flag1:
a1 = a1+step
else:
a1 = a1-step
if flag2:
a2 = a2+step
else:
a2 = a2-step
if int(a1) == 120:
flag1 = 0
if int(a1) == 59:
flag1 = 1
if int(a2) == 150:
flag2 = 0
if int(a2) == 29:
flag2 = 1
sock.close()
下面是接收机的代码。
import __future__ import division
import time
import Adafruit_PCA9685
import socket
import time
import struct
pwm = Adafruit_PCA9685.PCA9685()
servo_min = 150
servo_max = 600
def set_servo_pulse(channel,pulse):
pulse_length = 1000000
pulse_length //=60
print('{0}us per period'.format(pulse_length))
pulse_length //=4096
print('{0}us per bit'.format(pulse_length))
pulse *= 1000
pulse //= pulse_length
pwm.set_pwm(channel,0,pulse)
def set_servo_angle(channel,angle):
angle = 4096*((angle*11)+500)/20000
pwm.set_pwm(channel,0,int(angle))
pwm.set_pwm_freq(50)
print('start!')
HOST = '169.254.9.212'
PORT = 8888
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind((HOST,PORT))
while True:
data,address = sock.recvfrom(1024)
a1,a2 = struct.unpack('ff',data)
set_servo_angle(4,a1)
set_servo_angle(5,a2)
sock.close()
接收机,PCA9685和舵机的接线图如图所示。
4对应倾斜舵机,5对应底部舵机。
注意需要安装PCA9685固件库,对应方法可以在网络上查找。