не работает сервоприводFS90

Тема в разделе "Arduino & Shields", создана пользователем rover2012, 4 дек 2016.

  1. rover2012

    rover2012 Нуб

    Делаю систему на Arduino. которая позволяла бы управлять сервоприводом с помощью голоса(для работы использую Elechouse Voice Recognition Module v3.1(модуль распознавания речи)). Но возникла проблема: сервопривод не работает, при чем именно в основном коде, отдельно все работает. Происходит примерно следующее: серва начинает двигаться без команды и трещать, а при подаче команды просто встает на месте и все(так, конечно, быть не должно). Может кто сталкивался с такой проблемой.
    Вот сам код:
    #include <SoftwareSerial.h>
    #include <TimerOne.h>
    #include "VoiceRecognitionV3.h"
    #include <DFPlayer_Mini_Mp3.h>
    #include <Servo.h>

    Servo servo1;


    SoftwareSerial mySerial ( 5 , 4);

    VR myVR(3, 2); // 2:RX 3:TX, you can choose your favourite pins.
    uint8_t records[7];
    uint8_t buf[64];
    #define forwardRecord (0)
    #define backRecord (1)
    #define leftRecord (2)
    #define rightRecord (3)
    #define stopRecord (4)
    /**
    @brief Print signature, if the character is invisible,
    print hexible value instead.
    @param buf --> command length
    len --> number of parameters
    */



    void forward(){

    delay(500);
    mp3_play (2);
    delay(1000);
    servo1.write(110);
    delay(2500);
    }
    void back(){

    delay(500);
    mp3_play (3);
    delay(1000);
    servo1.write(70);
    delay(2500);
    }
    void left(){
    mp3_play (4);
    delay(1000);
    digitalWrite(10,HIGH);
    }
    void right(){

    mp3_play (5);
    delay(1000);
    digitalWrite(9,HIGH);
    }
    void stope(){

    mp3_play (6);
    delay(1000);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(9,LOW);
    digitalWrite(9,LOW);
    }
    void printSignature(uint8_t *buf, int len)
    {
    int i;
    for(i = 0; i < len; i++) {
    if (buf>0x19 && buf<0x7F) {
    Serial.write(buf);
    } else {
    Serial.print("[");
    Serial.print(buf, HEX);
    Serial.print("]");
    }
    }
    }
    /**
    @brief Print signature, if the character is invisible,
    print hexible value instead.
    @param buf --> VR module return value when voice is recognized.
    buf[0] --> Group mode(FF: None Group, 0x8n: User, 0x0n:System
    buf[1] --> number of record which is recognized.
    buf[2] --> Recognizer index(position) value of the recognized record.
    buf[3] --> Signature length
    buf[4]~buf[n] --> Signature
    */
    void printVR(uint8_t *buf)
    {
    Serial.println("VR Index\tGroup\tRecordNum\tSignature");
    Serial.print(buf[2], DEC);
    Serial.print("\t\t");
    if (buf[0] == 0xFF) {
    Serial.print("NONE");
    } else if (buf[0]&0x80) {
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
    } else {
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
    }
    Serial.print("\t");
    Serial.print(buf[1], DEC);
    Serial.print("\t\t");
    if (buf[3] > 0) {
    printSignature(buf+4, buf[3]);
    } else {
    Serial.print("NONE");
    }
    Serial.println("\r\n");
    }
    void setup(){

    pinMode(12,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(9,OUTPUT);

    servo1.attach(9);
    Serial.begin (9600);
    mySerial.begin (9600);
    mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
    delay(1); // delay 1ms to set volume
    mp3_set_volume (30); // value 0~30


    myVR.begin(9600);
    Serial.begin(115200);
    Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");
    if (myVR.clear() == 0) {
    Serial.println("Recognizer cleared.");
    } else {
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
    }
    if (myVR.load((uint8_t)forwardRecord ) >= 0) {
    Serial.println("forwardRecord loaded");
    }
    if (myVR.load((uint8_t)backRecord ) >= 0) {
    Serial.println("backRecord loaded");
    }
    if (myVR.load((uint8_t)leftRecord) >= 0) {
    Serial.println("leftkRecord loaded");
    }
    if (myVR.load((uint8_t)rightRecord ) >= 0) {
    Serial.println("rightRecord loaded");
    }
    if (myVR.load((uint8_t)stopRecord ) >= 0) {
    Serial.println("stopRecord loaded");
    }

    Timer1.initialize(100000);
    delay(100);
    mp3_play (1);
    delay(1000);
    }


    void loop()
    {

    int ret;
    ret = myVR.recognize(buf, 50);
    if (ret > 0) {
    switch(buf[1]){
    case forwardRecord :
    forward();
    Timer1.detachInterrupt();
    break;
    case backRecord :
    back();
    Timer1.detachInterrupt();
    break;
    case leftRecord:
    left();
    Timer1.detachInterrupt();
    break;
    case rightRecord:
    right();
    Timer1.detachInterrupt();
    break;
    case stopRecord:
    stope();
    Timer1.detachInterrupt();
    break;
    default:
    Timer1.detachInterrupt();
    Serial.println("Record function undefined");
    break;
    }
    printVR(buf);
    }

    }
     
  2. ZAZ-965

    ZAZ-965 Гуру

    @rover2012, у вас конфликт библиотек - библиотека Servo использует Timer1 и библиотека TimerOne использует его же.
    Оформите вставку кода по правилам - через теги code /code
     
  3. qwone

    qwone Гик

    Для подачи команду на серву можно использовать. micros()
     
  4. rover2012

    rover2012 Нуб

    Спасибо, за помощь