两台树莓派间的socket通信+简单应用

通信测试

先用网线连接两台树莓派,然后通过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固件库,对应方法可以在网络上查找。

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值