Отправка цифрового сигнала с одного Arduino на другой для запуска события
Я хочу отправить цифровой сигнал с одного Arduino на другой. Цель состоит в том, чтобы один Arduino отправил ВЫСОКИЙ сигнал на контакт принимающего Arduino. Пока контакт ВЫСОКИЙ, работайте
Сначала я успешно проверил это, помигав светодиодом на контакте 13, но затем я попытался добавить необходимую мне функциональность, но не смог заставить измениться состояние контакта 12.
Схема проста
Земля <--> Земля
контакт 10 --> контакт 12
Я видел, что уже есть запись с похожим заголовком, но мне это не помогло.
Есть идеи?
Хост Arduino
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#define BREAKOUT_RESET 9 // вывод сброса VS1053 (выход)
#define BREAKOUT_CS 10 // вывод выбора микросхемы VS1053 (выход)
#define BREAKOUT_DCS 8 // VS1053 Выбор данных/команд (выход)
// Это контакты, используемые для экрана создателя музыки
#define SHIELD_RESET -1 // вывод сброса VS1053 (не используется!)
#define SHIELD_CS 7 // вывод выбора микросхемы VS1053 (выход)
#define SHIELD_DCS 6 // VS1053 Выбор данных/команд (выход)
// Это общие контакты между прорывом и экраном
#define CARDCS 4 // пин выбора чипа карты
#define DREQ 3 // VS1053 Запрос данных, в идеале вывод прерывания
Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
//ЦИФРОВОЙ СИГНАЛЬНЫЙ ПИН
int pin = 10;
void setup() {
Serial.begin(9600);
if (! musicPlayer.begin()) { // инициализируем музыкальный проигрыватель
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // больше ничего не делаем
}
// список файлов
printDirectory(SD.open("/"), 0);
// Установить громкость для левого, правого каналов. меньшие цифры == громче громкость!
musicPlayer.setVolume(20,20);
// Прерывания по таймеру не рекомендуются, лучше использовать прерывание DREQ!
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // таймер целое
// Если DREQ находится на выводе прерывания (на uno, #2 или #3), мы можем сделать фон
// воспроизведение звука
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ целое
pinMode(pin, OUTPUT);}
void loop() {
digitalWrite(pin,LOW);
Serial.print(digitalRead(pin));
// Воспроизвести один файл, не возвращаться до завершения
Serial.println(F("Playing track 001"));
musicPlayer.playFullFile("track001.mp3");
// Воспроизведение другого файла в фоновом режиме, ТРЕБУЕТСЯ прерывание!
Serial.println(F("Playing track 002"));
musicPlayer.startPlayingFile("track002.mp3");
delay(100);
}
/// Помощник по листингу файлов
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// больше нет файлов
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// у файлов есть размеры, у каталогов нет
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
Подчиненный Arduino
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#define BREAKOUT_RESET 9 // вывод сброса VS1053 (выход)
#define BREAKOUT_CS 10 // вывод выбора микросхемы VS1053 (выход)
#define BREAKOUT_DCS 8 // VS1053 Выбор данных/команд (выход)
// Это контакты, используемые для экрана создателя музыки
#define SHIELD_RESET -1 // вывод сброса VS1053 (не используется!)
#define SHIELD_CS 7 // вывод выбора микросхемы VS1053 (выход)
#define SHIELD_DCS 6 // VS1053 Выбор данных/команд (выход)
// Это общие контакты между прорывом и экраном
#define CARDCS 4 // пин выбора чипа карты
// DREQ должен быть выводом Int, см. http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Запрос данных, в идеале вывод прерывания
Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
//ЦИФРОВОЙ СИГНАЛЬНЫЙ ПИН
int inPin = 12 ;
int state;
void setup() {
Serial.begin(9600);
if (! musicPlayer.begin()) { // инициализируем музыкальный проигрыватель
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // больше ничего не делаем
}
// список файлов
printDirectory(SD.open("/"), 0);
// Установить громкость для левого, правого каналов. меньшие цифры == громче громкость!
musicPlayer.setVolume(20,20);
// Прерывания по таймеру не рекомендуются, лучше использовать прерывание DREQ!
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // таймер целое
// Если DREQ находится на выводе прерывания (на uno, #2 или #3), мы можем сделать фон
// воспроизведение звука
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ целое
pinMode(inPin, INPUT);
}
void loop() {
state = digitalRead(inPin);
Serial.println(digitalRead(state));
if(state == HIGH){
musicPlayer.playFullFile("track001.mp3");
Serial.println(F("Playing track 001"));
}
}
/// Помощник по листингу файлов
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// больше нет файлов
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// у файлов есть размеры, у каталогов нет
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
@Edward, 👍0
Обсуждение2 ответа
Лучший ответ:
Один из методов заключается в использовании прерываний с конечным автоматом. Вот минимальный пример:
Мастер
#define pin 10 // подключение к ведомому цифровому входу
void setup(){
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
}
void loop(){
if( // вставляем ваше условие для срабатывания ведомого Arduino ){
digitalWrite(pin,HIGH);
delay(10); // короткая задержка
digitalWrite(pin,LOW);
}
}
Подчиненный
#define pin 2 // подключение к главному цифровому выходу "pin"
unsigned int state;
void setup(){
pinMode(pin,INPUT);
state=0;
attachInterrupt(digitalPinToInterrupt(pin),isr,RISING) // запускает ISR по переднему фронту основного сигнала напряжения
}
void loop(){
if(state==1){
// здесь ваш код
state=0; // сброс, когда сделано
}
}
void isr() {
state=1;
}
Цифровые прерывания можно выполнять на Arduino UNO с помощью контактов 2 и 3. Не забудьте также подключить общую электрическую землю между ардуино.
Если вы используете SPI, вы не можете использовать контакт 12 в качестве GPIO. Контакт 12 — SPI MISO.
- Как использовать SPI на Arduino?
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Программирование Arduino с помощью FTDI через контакты Tx и Rx
- Отправка информации (например, строки) через цифровые контакты
- Отправка цифрового сигнала с одного arduino на другой
- Не удается заставить клавиатуру использовать Keyboard.write на Arduino Uno
- Цифровой звуковой датчик
- digitalwrite() HIGH для ардуино
пожалуйста, напишите актуальный вопрос .... у вас либо проблема с изменением состояния контакта 12, либо с изменением состояния контакта 10 .... какой из них? .....непонятно какой из них выход, @jsotola
Что изменилось между работающим светодиодным тестом и фактической неработающей функциональностью? Чтобы эксперимент со светодиодами сработал, входной контакт принимающего Arduino должен был следовать за выходным сигналом отправителя. Проводка какая-нибудь менялась? Пинмод? Если нет, то проблема в новой кодировке., @JRobert