Ви не увійшли.
Сторінки 1
Нет, ноги разные, но не понятно по каким причинам, при servo.attach(номер_пина); на этом пине при ШИМ импульсы фигачат (смотрел осциллографом) пока его не отключишь servo.detach(); Может что-то в библиотеке сервы как-то связано-не вникал. Проще отключить при неиспользовании.
В общем большое спасибо, что откликнулись. Решение нашел: При переходе на управления блютуз-пин, который привязан к серве, нужно отключать командой servo.detach(); И всего-то лишь.
где то так сделано?
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; }
и т.д.
Что касается аппаратного ШИМ-сдается мне, что сложновато будет, хотя может и правильно. Но!!! Вопрос то остается: Каким макаром ШИМ на одних выводах влияют на совсем левый выход, который практически не используется в данный момент?
Такое дело. Где-то пол года назад сделал ребенку машинку-робота на ультразвуковом сенсоре объезжавшая препятствия. Тогда с ардуино только начинал знакомство. полистав просторы интернета-написал код (половину естественно стырил), пошлифовал его с месяц) - все. Работала машинка безукоризненно. Но захотелось присобачить модуль блютуз. Не вдаваясь в подробности-присобачил. Заработал (после пляски с бубном). Казалось бы все, дети играйтесь и не трожте меня больше. Но не тут то было. У машинки не было реализовано такое чувство как скорость движения. Ну тут, собственно, проблем не возникло. При работе через сенсор-изменение скорости нафиг не нужно, реализовал только в функции управления через блютуз.Вот и начались проблемы. При максимальной скорости движения-все четко, но стоить мне уменьшить скорость -как начинает непонятным образом крутиться серва. Еду вперед на 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();
}
}
Очень просто по смыслу: вход и выход, на вход идут импульсы определенной частоты (например от 10 до 500 в минуту), нужно так, чтобы на выходе было в это время, скажем, от 1 до 50 импульса в минуту. То-есть коэфициент 10. У меня что-то не получается сохранить пропорции, если при частоте 100 на входе получается 10 на выходе, то при 500 на входе - на выходе не 50, а 30 (к примеру).
Очень нужен делитель частоты импульсов. Может кто подскажет код, или хотя-бы направление, как реализовать. Я с ардуино только начал знакомство, так что прошу без насмешек-типа "проще пареной репы..." Все когда-то начинали. Буду очень признательный.
Сторінки 1