Проблемы с библиотекой Polytone

arduino-uno audio ultrasonics

Я создаю устройство, которое использует два ультразвуковых датчика для обнаружения объектов и обеспечивает звуковую обратную связь в виде звуковых сигналов, которые становятся тем быстрее, чем ближе объект. У меня есть два динамика, по одному для каждого датчика, но команда тон будет делать только один набор звуковых сигналов за раз. Я попытался обойти это с помощью команды Polytone Library и polytone, но когда я иду на компиляцию, я получаю сообщение "exit status 1. Error compiling for board Arduino Uno". Что я делаю не так? Есть ли другой способ заставить оба датчика пищать одновременно? Пожалуйста, помогите!

Я новичок в кодировании. Я попытался поместить политонный код несколькими различными способами, которые я могу показать, если это поможет. Там также есть код гироскопа, но у меня это работает довольно хорошо, поэтому я думаю, что просто игнорирую это.

    #include <digitalWriteFast.h>
#include <Polytone.h>


#include <Wire.h> //библиотека обеспечивает связь с устройствами I2C / TWI
#include <math.h> //библиотека включает математические функции


const int MPU=0x68; //I2C адрес для МПУ-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; //16-битных целых чисел
int AcXcal,AcYcal,AcZcal,GyXcal,GyYcal,GyZcal,tcal; //калибровка переменных
double t,tx,tf,pitch,roll;

const int anPin1 = 0;
const int anPin2 = 1;
int triggerPin1 = 13;


long distance1, distance2;

//Часть 2 кода: Светодиоды
// Level LEDs
int levelLED_level = 11;
int levelLED_rollpos = 9;
int levelLED_rollneg = 8;
int levelLED_pitchpos = 12;
int levelLED_pitchneg = 10;
int LED_temp = 7;
Polytone poly;
void setup(){
    Serial.begin(9600);  // sets the serial port to 9600
    pinMode(triggerPin1, OUTPUT);

    Wire.begin(); //initiate wire library and I2C
    Wire.beginTransmission(MPU); //begin transmission to I2C slave device
    Wire.write(0x6B); // PWR_MGMT_1 register
    Wire.write(0); // set to zero (wakes up the MPU-6050)  
    Wire.endTransmission(true); //ends transmission to I2C slave device
    Serial.begin(9600); //serial communication at 9600 bauds
   

    pinMode(levelLED_rollneg, OUTPUT);
    pinMode(levelLED_rollpos, OUTPUT);
    pinMode(levelLED_pitchpos, OUTPUT);
    pinMode(levelLED_pitchneg, OUTPUT);
    pinMode(levelLED_level, OUTPUT);
}

void start_sensor(){
  digitalWrite(triggerPin1,HIGH);
  delay(1);
  digitalWrite(triggerPin1,LOW);
}

void read_sensors(){
  /*
  Масштабный коэффициент (Vcc/512) на дюйм. Источник питания 5 В дает ~9,8 мВ/в
  Аналоговый вывод Arduino идет от 0 до 1024, поэтому значение должно быть разделено на 2, чтобы получить фактические дюймы
  */
  distance1 = analogRead(anPin1)*1.35;
  distance2 = analogRead(anPin2)*2.092;
}

void print_all(){
  Serial.print("MB1000");
  Serial.print(" ");
  Serial.print(distance1);
  Serial.print("mm");
  Serial.print(" ");
  Serial.print(" ");
  Serial.print("MB1260");
  Serial.print(" ");
  Serial.print(distance2);
  Serial.print("mm");
  Serial.println();
}

//Front sensor ranges
void midiSlowFront() {
  poly.begin(); // Настройка прерывания таймера опроса
  poly.setPins(4,5); // Подсоединить контакты 4-5 к положительной клемме динамика/пьезо

  poly.tone(262);
  delay(2000.0);
  poly.end();
}
void midiFront() {
   poly.begin(); // Set up polling timer interrupt
   poly.setPins(4,5); // Connect pins 4-5 to positive terminal of speaker/piezo
   poly.tone(262);
   delay(500.0);
   poly.end();
}
void midiFastFront() {
   poly.begin(); // Set up polling timer interrupt
   poly.setPins(4,5); // Connect pins 4-5 to positive terminal of speaker/piezo
   poly.tone(262);
   delay(150.0);
   poly.end();
}

//Side sensor ranges
void midiSlowSide() {
   poly.begin(); // Set up polling timer interrupt
   poly.setPins(4,5); // Connect pins 4-5 to positive terminal of speaker/piezo
   poly.tone(440);
   delay(2000.0);
   poly.end();
}
void midiSide() {
   poly.begin(); // Set up polling timer interrupt
   poly.setPins(4,5); // Connect pins 4-5 to positive terminal of speaker/piezo
   poly.tone(440);
   delay(500.0);
   poly.end();
}
void midiFastSide() {
   poly.begin(); // Set up polling timer interrupt
   poly.setPins(4,5); // Connect pins 4-5 to positive terminal of speaker/piezo
   poly.tone(440);
   delay(150.0);
   poly.end();
}

void loop(){
    Wire.beginTransmission(MPU); //begin transmission to I2C slave device
    Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false); //restarts transmission to I2C slave device
    Wire.requestFrom(MPU,14,true); //request 14 registers in total  

    start_sensor();
    read_sensors();
    print_all();

    //Acceleration data correction
    AcXcal = -950;
    AcYcal = -300;
    AcZcal = 0;

    //Temperature correction
    tcal = -1600;

    //Gyro correction
    GyXcal = 480;
    GyYcal = 170;
    GyZcal = 210;


    //read accelerometer data
    AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) 0x3C (ACCEL_XOUT_L)  
    AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) 0x3E (ACCEL_YOUT_L)
    AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) 0x40 (ACCEL_ZOUT_L)
 
    //read temperature data
    Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) 0x42 (TEMP_OUT_L)
 
    //read gyroscope data
    GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) 0x44 (GYRO_XOUT_L)
    GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) 0x46 (GYRO_YOUT_L)
    GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) 0x48 (GYRO_ZOUT_L)

    //temperature calculation
    tx = Tmp + tcal;
    t = tx/340 + 36.53; //equation for temperature in degrees C from datasheet
    tf = (t * 9/5) + 32; //fahrenheit

    //get pitch/roll
    getAngle(AcX,AcY,AcZ);
 
    //printing values to serial port
    Serial.print("Angle: ");
    Serial.print("Pitch = "); Serial.print(pitch);
    Serial.print(" Roll = "); Serial.println(roll);

    Serial.print("Temperature in celsius = "); Serial.print(t);  
    Serial.print(" fahrenheit = "); Serial.println(tf);  

    if ((roll < 7.00) && (roll > -7.00) && (pitch > -7.00) && (pitch < 7.00)){
    digitalWrite(levelLED_rollpos, LOW);
    digitalWrite(levelLED_rollneg, LOW);
    digitalWrite(levelLED_level, HIGH);
    digitalWrite(levelLED_pitchpos, LOW);
    digitalWrite(levelLED_pitchneg, LOW);
    }
   
    if (roll > 7.01) {
    // Turn on Pos Roll LED
    digitalWrite(levelLED_rollpos, HIGH);
    digitalWrite(levelLED_rollneg, LOW);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, LOW);
    digitalWrite(levelLED_pitchneg, LOW);
    }
   
    if (roll < -7.01) {
    //Turn on Neg Roll LED
    digitalWrite(levelLED_rollpos, LOW);
    digitalWrite(levelLED_rollneg, HIGH);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, LOW);
    digitalWrite(levelLED_pitchneg, LOW);
    }
   
    if (pitch < -7.01) {
    //Turn on Neg Pitch
    digitalWrite(levelLED_rollpos, LOW);
    digitalWrite(levelLED_rollneg, LOW);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, LOW);
    digitalWrite(levelLED_pitchneg, HIGH);
    }
   
    if (pitch > 7.01) {
    //Turn on Pos Pitch
    digitalWrite(levelLED_rollpos, LOW);
    digitalWrite(levelLED_rollneg, LOW);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, HIGH);
    digitalWrite(levelLED_pitchneg, LOW);
    }

    if ((pitch > 7.01) && (roll > 7.01)){
    digitalWrite(levelLED_rollpos, HIGH);
    digitalWrite(levelLED_rollneg, LOW);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, HIGH);
    digitalWrite(levelLED_pitchneg, LOW);
    }

    if ((roll > 7.01) && (pitch < -7.01)){
     digitalWrite(levelLED_rollpos, HIGH);
    digitalWrite(levelLED_rollneg, LOW);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, LOW);
    digitalWrite(levelLED_pitchneg, HIGH);
    }

    if ((roll < -7.01) && (pitch < -7.01)){
     digitalWrite(levelLED_rollpos, LOW);
    digitalWrite(levelLED_rollneg, HIGH);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, LOW);
    digitalWrite(levelLED_pitchneg, HIGH);
    }

    if ((roll < -7.01) && (pitch > 7.01)){
     digitalWrite(levelLED_rollpos, LOW);
    digitalWrite(levelLED_rollneg, HIGH);
    digitalWrite(levelLED_level, LOW);
    digitalWrite(levelLED_pitchpos, HIGH);
    digitalWrite(levelLED_pitchneg, LOW);
    }

    if (tf > 72.00){
      digitalWrite(LED_temp, HIGH);
    }

    if (tf < 72.00){
      digitalWrite(LED_temp, LOW);
    }

    if((distance1 > 24)){
    midiSlowFront();
    }
    if((distance1 < 24) && (distance1 > 12)){
    midiFront();
    }
    if(distance1 < 12){
    midiFastFront();
    }
    if(distance2 > 24){
    midiSlowSide();
    }
    if((distance2 < 24) && (distance2 > 12)){
    midiSide();
    }
    if(distance2 < 12){
    midiFastSide();
    }
  delay(150);
}


//function to convert accelerometer values into pitch and roll
void getAngle(int Ax,int Ay,int Az) {
    double x = Ax;
    double y = Ay;
    double z = Az;

    pitch = atan(x/sqrt((y*y) + (z*z))); //pitch calculation
    roll = atan(y/sqrt((x*x) + (z*z))); //roll calculation

    //converting radians into degrees
    pitch = pitch * (180.0/3.14);
    roll = roll * (180.0/3.14) ;
}

EDIT: Вот материал перед сообщением об ошибке, мой плохой!



In file included from C:\Users\Documents\Arduino\polytonetest\polytonetest.ino:1:0:

C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src/digitalWriteFast.h:25:0: warning: "digitalPinToTimer" redefined

 #define digitalPinToTimer(P) \

 

In file included from sketch\polytonetest.ino.cpp:1:0:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:180:0: note: this is the location of the previous definition

 #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )

 

In file included from C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src\Polytone.h:11:0,

                 from C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src\Polytone.cpp:7:

C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src\digitalWriteFast.h:25:0: warning: "digitalPinToTimer" redefined

 #define digitalPinToTimer(P) \

 

In file included from C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src\Polytone.h:10:0,

                 from C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src\Polytone.cpp:7:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:180:0: note: this is the location of the previous definition

 #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )

 

libraries\arduino-polytone-master\Polytone.cpp.o (symbol from plugin): In function `Polytone::begin()':

(.text+0x0): multiple definition of `t'

sketch\polytonetest.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

C:\Users\Documents\Arduino\libraries\arduino-polytone-master\src\Polytone.cpp:18:15: warning: type of 't' does not match original declaration [-Wlto-type-mismatch]

 unsigned long t = 0;

               ^

C:\Users\Documents\Arduino\polytonetest\polytonetest.ino:12:8: note: type 'double' should match type 'long unsigned int'

 double t,tx,tf,pitch,roll;

        ^

C:\Users\Documents\Arduino\polytonetest\polytonetest.ino:12:8: note: 't' was previously declared here

C:\Users\Documents\Arduino\polytonetest\polytonetest.ino:12:8: note: code may be misoptimized unless -fno-strict-aliasing is used

collect2.exe: error: ld returned 1 exit status

, 👍2

Обсуждение

Весь этот текст, который появляется перед "статусом выхода 1", говорит вам, что не так. Без этого мы знаем меньше, чем вы., @Majenko

Ооо, я понимаю! Извини за это! Я буду редактировать этот пост!, @Kaytee