openmv控制舵机
-
为什么控制的时候会无故抖动,有时改没有反应
-
请贴出具体的代码和你的过程
-
//=======================================================
// 智能小车超声波测距实验
//===============================================================int Echo = A5; // Echo回声脚
int Trig = A4;// Trig 触发脚()
void Motor_Forward();
void Motor_Back();
void Motor_Stop();
void Motor_Left();
void klc(); //识别判断函数
int PWM =5; //定义电机PWM引脚
int DIR =4; //定义电机方向引脚
int PWM1 =6;
int DIR1 =7;
int val = 150; //电机速度
int Distance1 = 0;
int Distance2 = 0;
int Distance3 = 0;
int Distance = 0;
int a = 1;
int flag = 0;
int k = 100; //转弯速度
int b = 0;
int c = 2;
int o = 0;void setup()
{
Serial.begin(9600); // 初始化串口
//初始化电机驱动IO为输出方式
//初始化超声波引脚
pinMode(Echo, INPUT); // 定义超声波输入脚
pinMode(Trig, OUTPUT); // 定义超声波输出脚
pinMode(PWM,OUTPUT);
pinMode(DIR,OUTPUT);
delay(1000); //开机延时}
void Distance_test() // 量出前方距离
{
digitalWrite(Trig, LOW); // 给触发脚低电平2μs
delayMicroseconds(2);
digitalWrite(Trig, HIGH); // 给触发脚高电平10μs,这里至少是10μs
delayMicroseconds(10);//10us
digitalWrite(Trig, LOW); // 持续给触发脚低电
float Fdistance = pulseIn(Echo, HIGH); // 读取高电平时间(单位:微秒)
Fdistance= Fdistance/58; //为什么除以58等于厘米, Y米=(X秒344)/2
// X秒=( 2Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
switch (a){
case 1:Distance1 = Fdistance;
case 2:Distance1 = Fdistance;
case 3:Distance1 = Fdistance;
}
if(a==3){a=0;}
else a++;
Distance=Distance1+Distance2+Distance3;
}void loop()
{
if(Serial.available()){ /判断串口有没有信息可以接受/
o = 0;
while(o == 0){
klc(); /当小车接受到openmv发送来的信息时判断前方有没有障碍物/
if(o == 0){
Motor_Forward();
delay(10);
}
}
}
klc(); /当小车没有接受到openmv发送来的信息时继续判断前方有没有障碍物/
Motor_Left();
delay(10); /如果arduino继续保持速度前进/
}void Motor_Forward() /前进函数/
{
digitalWrite(DIR,HIGH);
analogWrite(PWM, val);
digitalWrite(DIR1,LOW);
analogWrite(PWM1, val);
}
void Motor_Back() /后退函数/
{
digitalWrite(DIR,LOW);
analogWrite(PWM, val);
digitalWrite(DIR1,HIGH);
analogWrite(PWM1, val);
}
void Motor_Stop() /停止函数/
{
digitalWrite(DIR,LOW);
analogWrite(PWM, 0);
digitalWrite(DIR1,LOW);
analogWrite(PWM1, 0);
}
void Motor_Left() /左转函数/
{
digitalWrite(DIR,HIGH);
analogWrite(PWM, k);
digitalWrite(DIR1,LOW);
analogWrite(PWM1, k);
}
void klc() /判断停止函数/
{
Distance_test();
Distance_test();
Distance_test(); /取3次距离平均值/
if(Distance<29){ /如果前一个动作为前行,后退消除惯性/
Serial.println(b); /发送数据是arduino停止对准光源/
Motor_Stop(); /如果前一个动作为暂停,保持停止/
delay(1500);
Motor_Back();
delay(1500);
Serial.println(c); /发送数据让openmv继续旋转/
o=1;
}}
想用openmv做一台追光小车这是arduino代码,
import sensor, image, time
from pyb import UART
from pyb import Servo
import json#设置阈值
red_threshold_01 = ( 31, 54, 53, 78, 16, 64) #近阈值
red_threshold_02 = ( 8, 57, 23, 78, 16, 64) #远阈值
enable=0
def dj(b):
step=0
x = b #将b[5]赋值给x
c=abs(80-b) #把cx与中心x值的差赋值给c
#下面为简单的识别舵机运动算法,具体根据实际调试修改参数,可以自行优化
if x > 81:
step=step-int(x-80)
if -800 > step:
step=step+int(x-80)
if x < 79:
step=step+int(80-x)
if step > 900:
step=step-int(80-x)
s1.pulse_width(1500-step) #舵机旋转角度
d=step
print('偏转量 :',step)#若偏离程度较小则小车加速 if c < 1: if d == 1550: uart.write('fast\r') print('jia su')
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.set_auto_whitebal(False)
sensor.set_auto_gain(False) #关闭自动亮度增益,太暗了可以自行打开
#sensor.set_hmirror(True) #水平镜像,方便调试
sensor.set_contrast(3) #设置对比度为3
sensor.set_brightness(-3) #设置亮度最低
sensor.set_auto_exposure(False)
sensor.skip_frames(10)
clock = time.clock()s1 = Servo(1) #P7 舵机
s1.pulse_width(1100) #舵机初始化到中间位置#设置感兴趣区域大小
ROI=(0,0,160,120)uart = UART(3, 9600)
while(True):
img = sensor.snapshot()#设置感兴趣区域 statistics=img.get_statistics(roi=ROI) #分阈值查找色块,并返回数组 blobs1 = img.find_blobs([red_threshold_01],x_stride=1, y_stride=1,roi=ROI,area_threshold=1) blobs2 = img.find_blobs([red_threshold_02],x_stride=1, y_stride=1,roi=ROI,area_threshold=1)
#色块在近处
if blobs1:
for b1 in blobs1:
if b1[2]>1 and b1[3]>1:
img.draw_rectangle(b1.rect(),color=(255,255,0)) #根据色块大小画黄色框
img.draw_cross(b1.cx(), b1.cy(),color=(255,255,0)) #根据色块中心点画黄色十字架
dj(b1.cx())
print('jin')
print('b1[5]=',b1[5])
#色块不在近处但在远处
else:
if blobs2:
for b2 in blobs2:
if b2[2]>1 and b2[3]>1:
img.draw_rectangle(b2.rect(),color=(255,255,255)) #根据色块大小画白色框
img.draw_cross(b2.cx(), b2.cy(),color=(255,255,255)) #根据色块中心点画白色十字架
dj(b2[5])
print('yuan')
print('b2[5]=',b2[5])
这是openmv的代码,连接完小车后小车舵机一直抖,不知道怎么回事,在并没有光源的情况下
-
-
舵机是连接哪里的,arduino还是OpenMV
-
OpenMV 的阈值有没有问题
-
控制需要PID
-
-
@kidswong999 舵机是连接openmv的,阈值没有问题,有没有PID教程的链接