Проблемы с библиотекой Polytone
Я создаю устройство, которое использует два ультразвуковых датчика для обнаружения объектов и обеспечивает звуковую обратную связь в виде звуковых сигналов, которые становятся тем быстрее, чем ближе объект. У меня есть два динамика, по одному для каждого датчика, но команда тон будет делать только один набор звуковых сигналов за раз. Я попытался обойти это с помощью команды 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
@Kaytee, 👍2
Обсуждение0
- Как подключить ардуино к разъему для наушников?
- Подключить Arduino к телефонной линии?
- Водонепроницаемый ультразвуковой датчик sro4m-2
- Синтезатор Arduino Uno — выход линейного уровня (аудио) на микшер/усилитель
- DFPlayer для записи на SD-карту
- Генерация истинного аналогового сигнала с помощью Arduino
- Можем ли мы генерировать тон 20 кГц с обычным зуммером в arduino?
- Ультразвуковой датчик или инфракрасный датчик лучше для измерения расстояния (до/от человеческого тела)?
Весь этот текст, который появляется перед "статусом выхода 1", говорит вам, что не так. Без этого мы знаем меньше, чем вы., @Majenko
Ооо, я понимаю! Извини за это! Я буду редактировать этот пост!, @Kaytee