Arduino прошивка для S4A

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

  1. Dimon1425

    Dimon1425 Нуб

    Здравствуйте пытаюсь прошить Arduino UNO для S4A но вовремя компиляции пишет ошибку:

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino:10:1: warning: 'typedef' was ignored in this declaration

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void setup()':

    S4AFirmware15:20: error: 'configurePins' was not declared in this scope

    S4AFirmware15:21: error: 'resetPins' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void loop()':

    S4AFirmware15:30: error: 'sendUpdateServomotors' was not declared in this scope

    S4AFirmware15:31: error: 'sendSensorValues' was not declared in this scope

    S4AFirmware15:35: error: 'readSerialPort' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void resetPins()':

    S4AFirmware15:65: error: 'servo' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void sendSensorValues()':

    S4AFirmware15:85: error: 'insertionSort' was not declared in this scope

    S4AFirmware15:91: error: 'ScratchBoardSensorReport' was not declared in this scope

    S4AFirmware15:94: error: 'ScratchBoardSensorReport' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void insertionSort(unsigned int*, unsigned int)':

    S4AFirmware15:102: error: 'swap' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void readSerialPort()':

    S4AFirmware15:150: error: 'updateActuator' was not declared in this scope

    S4AFirmware15:155: error: 'checkScratchDisconnection' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void sendUpdateServomotors()':

    S4AFirmware15:174: error: 'servo' was not declared in this scope

    C:\Users\Администратор\Desktop\Ардуино\S4AFirmware15\S4AFirmware15.ino: In function 'void servo(byte, byte)':

    S4AFirmware15:180: error: 'pulse' was not declared in this scope

    exit status 1
    'configurePins' was not declared in this scope
     
  2. vvr

    vvr Инженерище

    а хотя бы с переводчиком не пытались разобраться что вам написали в ошибках ?
     
  3. Поручик

    Поручик Нерд

    вы пытаетесь использовать незнакомые компилятору слова. проверьте подключение библиотек и объявление переменных
     
  4. Dimon1425

    Dimon1425 Нуб

    typedef enum {
    input, servomotor, pwm, digital }
    pinType;

    typedef struct pin {
    pinType type; //Type of pin
    int state; //State of an output
    //byte value; //Value of an input. Not used by now. TODO
    };

    pin arduinoPins[14]; //Array of struct holding 0-13 pins information

    unsigned long lastDataReceivedTime = millis();

    void setup()
    {
    Serial.begin(38400);
    Serial.flush();
    configurePins();// На него ругается.
    resetPins();
    }

    void loop()
    {
    static unsigned long timerCheckUpdate = millis();

    if (millis()-timerCheckUpdate>=20)
    {
    sendUpdateServomotors();
    sendSensorValues();
    timerCheckUpdate=millis();
    }

    readSerialPort();
    }

    void configurePins()
    {
    arduinoPins[0].type=input;
    arduinoPins[1].type=input;
    arduinoPins[2].type=input;
    arduinoPins[3].type=input;
    arduinoPins[4].type=servomotor;
    arduinoPins[5].type=pwm;
    arduinoPins[6].type=pwm;
    arduinoPins[7].type=servomotor;
    arduinoPins[8].type=servomotor;
    arduinoPins[9].type=pwm;
    arduinoPins[10].type=digital;
    arduinoPins[11].type=digital;
    arduinoPins[12].type=digital;
    arduinoPins[13].type=digital;
    }

    void resetPins() {
    for (byte index=0; index <=13; index++)
    {
    if (arduinoPins[index].type!=input)
    {
    pinMode(index, OUTPUT);
    if (arduinoPins[index].type==servomotor)
    {
    arduinoPins[index].state = 255;
    servo (index, 255);
    }
    else
    {
    arduinoPins[index].state=0;
    digitalWrite(index,LOW);
    }
    }
    }
    }

    void sendSensorValues()
    {
    unsigned int sensorValues[6], readings[5];
    byte sensorIndex;

    for (sensorIndex = 0; sensorIndex < 6; sensorIndex++) //for analog sensors, calculate the median of 5 sensor readings in order to avoid variability and power surges
    {
    for (byte p = 0; p < 5; p++)
    readings[p] = analogRead(sensorIndex);
    insertionSort(readings, 5); //sort readings
    sensorValues[sensorIndex] = readings[2]; //select median reading
    }

    //send analog sensor values
    for (sensorIndex = 0; sensorIndex < 6; sensorIndex++)
    ScratchBoardSensorReport(sensorIndex, sensorValues[sensorIndex]);

    //send digital sensor values
    ScratchBoardSensorReport(6, digitalRead(2)?1023:0);
    ScratchBoardSensorReport(7, digitalRead(3)?1023:0);
    }

    void insertionSort(unsigned int* array, unsigned int n)
    {
    for (int i = 1; i < n; i++)
    for (int j = i; (j > 0) && ( array[j] < array[j-1] ); j--)
    swap( array, j, j-1 );
    }

    void swap(unsigned int* array, unsigned int a, unsigned int b)
    {
    unsigned int temp = array[a];
    array[a] = array;
    array = temp;
    }

    void ScratchBoardSensorReport(byte sensor, int value) //PicoBoard protocol, 2 bytes per sensor
    {
    Serial.write( B10000000
    | ((sensor & B1111)<<3)
    | ((value>>7) & B111));
    Serial.write( value & B1111111);
    }

    void readSerialPort()
    {
    byte pin;
    int newVal;
    static byte actuatorHighByte, actuatorLowByte;
    static byte readingSM = 0;

    if (Serial.available())
    {
    if (readingSM == 0)
    {
    actuatorHighByte = Serial.read();
    if (actuatorHighByte >= 128) readingSM = 1;
    }
    else if (readingSM == 1)
    {
    actuatorLowByte = Serial.read();
    if (actuatorLowByte < 128) readingSM = 2;
    else readingSM = 0;
    }

    if (readingSM == 2)
    {
    lastDataReceivedTime = millis();
    pin = ((actuatorHighByte >> 3) & 0x0F);
    newVal = ((actuatorHighByte & 0x07) << 7) | (actuatorLowByte & 0x7F);

    if(arduinoPins[pin].state != newVal)
    {
    arduinoPins[pin].state = newVal;
    updateActuator(pin);
    }
    readingSM = 0;
    }
    }
    else checkScratchDisconnection();
    }

    void reset() //with xbee module, we need to simulate the setup execution that occurs when a usb connection is opened or closed without this module
    {
    resetPins(); // reset pins
    sendSensorValues(); // protocol handshaking
    lastDataReceivedTime = millis();
    }

    void updateActuator(byte pinNumber)
    {
    if (arduinoPins[pinNumber].type==digital) digitalWrite(pinNumber, arduinoPins[pinNumber].state);
    else if (arduinoPins[pinNumber].type==pwm) analogWrite(pinNumber, arduinoPins[pinNumber].state);
    }

    void sendUpdateServomotors()
    {
    for (byte p = 0; p < 10; p++)
    if (arduinoPins[p].type == servomotor) servo(p, arduinoPins[p].state);
    }

    void servo (byte pinNumber, byte angle)
    {
    if (angle != 255)
    pulse(pinNumber, (angle * 10) + 600);
    }

    void pulse (byte pinNumber, unsigned int pulseWidth)
    {
    digitalWrite(pinNumber, HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(pinNumber, LOW);
    }

    void checkScratchDisconnection() //the reset is necessary when using an wireless arduino board (because we need to ensure that arduino isn't waiting the actuators state from Scratch) or when scratch isn't sending information (because is how serial port close is detected)
    {
    if (millis() - lastDataReceivedTime > 1000) reset(); //reset state if actuators reception timeout = one second
    }


     
  5. Поручик

    Поручик Нерд


    вы всё сообщение прочтите, он у вас через строчку ругается. "pulse","servo"....
     
  6. Поручик

    Поручик Нерд

    ах да. вы должны писать функцию ДО её вызова. или ставить вначале кода её объявление.
     
  7. Dimon1425

    Dimon1425 Нуб

    Но почему она не работает ? я ее с официального сайта скачал. Да и с других тоже не работает. До функций мне еще далеко.
     
  8. Поручик

    Поручик Нерд

    вы должны объявить функцию до того, как её вызовите. т.е. написать что делать до того как скажете, что надо это делать.
    http://cppstudio.com/post/6471/
     
  9. AlexU

    AlexU Гуру

    В Arduino IDE этого делать не обязательно. При подготовке исходников из скетча *.ino среда сама сделает нужные объявления, что бы компилятор не ругался.

    Чем сборку (компиляцию) производите? Arduino IDE v 1.6.11 прекрасно справляется со скетчем S4A с официального сайта.
     
    Поручик нравится это.
  10. Dimon1425

    Dimon1425 Нуб

    1.6.12
     
  11. Dimon1425

    Dimon1425 Нуб

    Если я бы это знал то не рвался бы за S4A . Надо просто начать ..
     
  12. Поручик

    Поручик Нерд

    а почему не на с??
    там же всё кристально, и на амперковой вики лежат очень годные статьи....
     
  13. Dimon1425

    Dimon1425 Нуб

    Надо проста начать с простого. Поэтому мне надо S4A но пока не найду выход чтобы S4A заработал!
     
  14. Поручик

    Поручик Нерд

    а. э. нет. надо с нормального. перейти с этой штуки на что-то нормальное будет оооочень сложно. инфа 110%.
     
  15. Dimon1425

    Dimon1425 Нуб

    Я все это прекрасно понимаю. Главное это понять принцип. И я вообще то тут для решения проблемы. Все остальное успеется.
     
  16. Dimon1425

    Dimon1425 Нуб

    И наверное не дождусь!
     
  17. AlexU

    AlexU Гуру

    Это не стабильная версия, но всё равно S4A в ней собирается без ошибок.
    Есть одно предположение, связанное с непонятными символами в пути к скетчу:
    Это кириллица в названиях каталогов. Надо кириллицу убрать, т.е. файл скетча поместить в каталог, в пути к которому не будет русских буковок. Например, C:/arduino/s4a/S4AFirmware15.ino.
    И возьмите 16-ю версию S4A с официального сайта.
     
    Cynep нравится это.
  18. Dimon1425

    Dimon1425 Нуб

    Большое СПАСИБО помогло, но arduino сам создает папку и перемещает его туда и только от туда можно загрузить. У меня получилось с 3 раз так как до этого выдавал нет доступа к порту или он заблокирован.
     
  19. Gans23

    Gans23 Нуб

    У меня такая же проблема:
    C:\Users\Alex\Documents\Arduino\S4AFirmware16\S4AFirmware16.ino:51:1: warning: 'typedef' was ignored in this declaration

    };

    ^
    Причем как видно не в кирилице дело, пробовал уже на двух компьютерах. При этом скет можно и залить, вот только S4a платку не видит...
     
  20. AlexU

    AlexU Гуру

    Если проблема только в этом warning, то это не проблема. И отсутствие/присутствие кириллицы здесь не при чём. Может кроме этого предупреждения есть ошибки (errors)?
    Хотя если:
    то скорее всего ошибок нет и проблема у Вас в другом.