Ви не увійшли.
Сторінки 1
Такое дело. Где-то пол года назад сделал ребенку машинку-робота на ультразвуковом сенсоре объезжавшая препятствия. Тогда с ардуино только начинал знакомство. полистав просторы интернета-написал код (половину естественно стырил), пошлифовал его с месяц) - все. Работала машинка безукоризненно. Но захотелось присобачить модуль блютуз. Не вдаваясь в подробности-присобачил. Заработал (после пляски с бубном). Казалось бы все, дети играйтесь и не трожте меня больше. Но не тут то было. У машинки не было реализовано такое чувство как скорость движения. Ну тут, собственно, проблем не возникло. При работе через сенсор-изменение скорости нафиг не нужно, реализовал только в функции управления через блютуз.Вот и начались проблемы. При максимальной скорости движения-все четко, но стоить мне уменьшить скорость -как начинает непонятным образом крутиться серва. Еду вперед на 50% скорости-нормально, еду назад-серва с ума сходит, поворачиваю налево - нормально, направо-с ума сходит. В функции управлением через блютуз-серва никаким образом не проскакивает в коде. Вывод - помехи? (менял пин подключения сервы- 0 результат). Кто что подскажет? Фрагмент кода с функцией управления по блютуз.
#include <Servo.h>
const int motor1APin = 3;
const int motor2APin = 5;
const int motor3APin = 6;
const int motor4APin = 9;
const int vbtn = 2;
int vcmd;
Servo vservo;
const int vservo_array[5]={
0,45,90,135,180};
byte vspeed;
int vservo_int;
int vmode;
//***************************************
void setup() {
pinMode( motor1APin, OUTPUT);
pinMode( motor2APin, OUTPUT);
pinMode( motor3APin, OUTPUT);
pinMode( motor4APin, OUTPUT);
Serial.begin(9600);
vservo.attach(17); // МЕНЯЛ РАЗНЫЕ ПИНЫ
vservo.write(90);
pinMode(vbtn, INPUT);
vspeed=0;
}
//********************************************************************
void loop() {
vmode = digitalRead(vbtn);
switch (vmode) {
case 0:
NoBT();
break;
case 1:
// Режим управления через Bluetooth
BT();
break;
}
}
//*******************
void vforward() {
analogWrite(motor1APin, vspeed);
analogWrite(motor2APin, 0);
analogWrite(motor3APin, vspeed);
analogWrite(motor4APin, 0);
}
void back() {
analogWrite(motor1APin,0);
analogWrite(motor2APin, vspeed);
analogWrite(motor3APin, 0);
analogWrite(motor4APin, vspeed);
}
void vforwardRL() {
analogWrite(motor1APin, vspeed);
analogWrite(motor2APin, 0);
analogWrite(motor3APin, 0);
analogWrite(motor4APin, vspeed);
}
void vforwardL(){
analogWrite(motor1APin, 0);
analogWrite(motor2APin, vspeed);
analogWrite(motor3APin, vspeed);
analogWrite(motor4APin, 0);
}
void vbackwardRL() {
analogWrite(motor1APin, 0);
analogWrite(motor2APin, 0);
analogWrite(motor3APin, 0);
analogWrite(motor4APin, vspeed);
}
void vbackwardL() {
analogWrite(motor1APin, vspeed);
analogWrite(motor2APin, 0);
analogWrite(motor3APin, 0);
analogWrite(motor4APin, 0);
}
void left() {
analogWrite(motor1APin, vspeed);
analogWrite(motor2APin, 0);
analogWrite(motor3APin, 0);
analogWrite(motor4APin, vspeed);
}
void right() {
analogWrite(motor1APin, 0);
analogWrite(motor2APin, vspeed);
analogWrite(motor3APin, vspeed);
analogWrite(motor4APin, 0);
}
void vstop(){
analogWrite(motor1APin, 0);
analogWrite(motor2APin, 0);
analogWrite(motor3APin, 0);
analogWrite(motor4APin, 0);
}
//********************************************************
void BT(){
if (Serial.available())
vcmd = (char)Serial.read();
//vservo_int = LOW; Пытался устанавливать пин сервы в 0-не помогло. Крутится зараза!!!
if (vcmd == '1') {
vspeed = 25; }
if (vcmd == '2') {
vspeed = 50; }
if (vcmd == '3') {
vspeed = 75; }
if (vcmd == '4') {
vspeed = 100; }
if (vcmd == '5') {
vspeed = 125; }
if (vcmd == '6') {
vspeed = 150; }
if (vcmd == '7') {
vspeed = 175; }
if (vcmd == '8') {
vspeed = 200; }
if (vcmd == '9') {
vspeed = 225; }
if (vcmd == 'q') {
vspeed = 255; }
if (vcmd == 'F') {
vforward();
}
if (vcmd == 'B')
{
back();
}
if (vcmd == 'L')
{
left();
}
if (vcmd == 'R')
{
right();
}
if (vcmd == 'J')
{
vbackwardRL();
}
if (vcmd == 'H')
{
vbackwardL();
}
if (vcmd == 'G')
{
vforwardRL();
}
if (vcmd == 'I')
{
vforwardL();
}
if (vcmd == 'S')
{
vstop();
}
}
Неактивний
где то так сделано?
void loop()
{
digitalWrite(13, HIGH);
delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz
digitalWrite(13, LOW);
delayMicroseconds(1000 - 100);
}
переведите на аппаратный, пример :
Secrets of Arduino PWM
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS22);
OCR2A = 180;
OCR2B = 50;
On the Arduino Duemilanove, these values yield:
Output A frequency: 16 MHz / 64 / 256 = 976.5625Hz
Output A duty cycle: (180+1) / 256 = 70.7%
Output B frequency: 16 MHz / 64 / 256 = 976.5625Hz
Output B duty cycle: (50+1) / 256 = 19.9%
и хватит ли ресурсов, помнится не много там ШИМов аппаратных.
Неактивний
где то так сделано?
void loop() { digitalWrite(13, HIGH); delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz digitalWrite(13, LOW); delayMicroseconds(1000 - 100); }
У меня управление скоростью задается переменной vspeed, которая меняется 0-255 в зависимости от команды которая приходит с блютуз.
if (vcmd == '1') {
vspeed = 25; }
if (vcmd == '2') {
vspeed = 50; }
if (vcmd == '3') {
vspeed = 75; }
и т.д.
Что касается аппаратного ШИМ-сдается мне, что сложновато будет, хотя может и правильно. Но!!! Вопрос то остается: Каким макаром ШИМ на одних выводах влияют на совсем левый выход, который практически не используется в данный момент?
Неактивний
если работаете с железом, купите осцилограф, или в гости сходите к челу у которого есть такая штука ) думаю много прояснится что не так с Вашим кодом.
по хорошему нужно просмотреть код библиотеки servo
с PWM работал, с сервой нет, но думаю что данные штуки (серво) чувствительны к срыву частоты.
Неактивний
В общем большое спасибо, что откликнулись. Решение нашел: При переходе на управления блютуз-пин, который привязан к серве, нужно отключать командой servo.detach(); И всего-то лишь.
Остання редакція pv_serg (2015-01-21 13:34:20)
Неактивний
Нет, ноги разные, но не понятно по каким причинам, при servo.attach(номер_пина); на этом пине при ШИМ импульсы фигачат (смотрел осциллографом) пока его не отключишь servo.detach(); Может что-то в библиотеке сервы как-то связано-не вникал. Проще отключить при неиспользовании.
Неактивний
Сторінки 1