实验任务
1.电位器操控舵机
2.for循环和range()函数
3.def自定义函数
测试软件
mind+RC1.7.0 python代码模式
知识储备
1.电位器
电位器是具有三个引出端、阻值可按某种变化规律调节的电阻元件。电位器通常由电阻体和可移动的电刷组成。当电刷沿电阻体移动时,在输出端即获得与位移量成一定关系的电阻值或电压。PinPong Board 采用UNO板子作为核心,电位器集成在A3模拟口,UNO模拟输入功能有10位精度,可以将0~5V的电压信号转换为0~1023的整数形式表示。
2.舵机
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
3.FOR循环
Python for循环可以遍历任何序列的项目,可以是一个列表或一个字符串等。
语法格式:
for iterating_var in sequence:
statements(s)
4.range()函数
range() 函数可创建一个整数列表,一般和for 循环搭配使用。
range函数格式
range(start, stop[, step])
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
5.def自定义函数
函数是组织好的,可重复使用,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率;本节常识自己创建函数,即用户自定义函数。
def functionname( parameters ):
function_suite
return [expression]
步骤1 双舵机循环摆动
注意:
舵机定义时,S1和S2需要分开,不能像下面这样连续定义
s1 = Servo(Pin(Pin.D6)) #将Pin传入Servo中初始化舵机引脚
s2 = Servo(Pin(Pin.D7)) #将Pin传入Servo中初始化舵机引脚
import time
from pinpong.board import Board,Pin,Servo
Board("uno").begin() #初始化,选择板型和端口号
while True:
s1 = Servo(Pin(Pin.D6)) #将Pin传入Servo中初始化舵机引脚
for i in range(1,181): #从0到180循环
s1.angle(i) #控制舵机转到i度位置
print(i)
time.sleep(0.05)
for i in range(180,-1,-1): #从0到180循环
s1.angle(i) #控制舵机转到i度位置
print(i)
time.sleep(0.05)
s2 = Servo(Pin(Pin.D7)) #将Pin传入Servo中初始化舵机引脚
for j in range(0,181): #从0到180循环
s2.angle(j) #控制舵机转到j度位置
print(j)
time.sleep(0.05)
for j in range(180,-1,-1): #从0到180循环
s2.angle(j) #控制舵机转到j度位置
print(j)
time.sleep(0.05)
步骤2 电位器控制舵机
import time
from pinpong.board import Board,Pin,ADC,Servo
Board("uno").begin() #初始化,选择板型和端口号,不输入端口号则进行自动识别
adc3 = ADC(Pin(Pin.A3)) #将Pin传入ADC中实现模拟输入
s1 = Servo(Pin(Pin.D6)) #将Pin传入Servo中初始化舵机引脚
while True:
v = adc3.read() #读取A3口模拟信号数值
print(v)#打印电位器的数值
v=int((v - 0) * (180 - 0) / (1023 - 0) + 0)#用映射公式转换数值为舵机角度
#(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
print(v)
s1.angle(v)
time.sleep(0.05)
步骤3 电位器控制舵机(自定义函数版)
python库中的map映射函数和ardunio的差别较大,不适合初学者教学;
本文映射函数参考ardunio C的 map函数自行编写,后附自定义函数的写法。
ardunio C的 map函数
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
python版map函数
def map(x,in_min,in_max,out_min,out_max):
mapk=(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
return int(mapk) #返回角度值取整数
import time
from pinpong.board import Board,Pin,ADC,Servo
Board("uno").begin() #初始化,选择板型和端口号,不输入端口号则进行自动识别
adc3 = ADC(Pin(Pin.A3)) #将Pin传入ADC中实现模拟输入
s1 = Servo(Pin(Pin.D6)) #将Pin传入Servo中初始化舵机引脚
def map(x,in_min,in_max,out_min,out_max):
mapk=(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
return int(mapk) #返回角度值取整数
while True:
v = adc3.read() #读取A3口模拟信号数值
#print(v)#打印电位器的数值
v=map(v,0,1023,0,180)
print(v)#打印角度值
s1.angle(v)#舵机运转
time.sleep(0.05)
DFB1gA6GZdd2021.05.06
2209的