Отправка цифрового сигнала с одного 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();
   }
}

, 👍0

Обсуждение

пожалуйста, напишите актуальный вопрос .... у вас либо проблема с изменением состояния контакта 12, либо с изменением состояния контакта 10 .... какой из них? .....непонятно какой из них выход, @jsotola

Что изменилось между работающим светодиодным тестом и фактической неработающей функциональностью? Чтобы эксперимент со светодиодами сработал, входной контакт принимающего Arduino должен был следовать за выходным сигналом отправителя. Проводка какая-нибудь менялась? Пинмод? Если нет, то проблема в новой кодировке., @JRobert


2 ответа


Лучший ответ:

1

Один из методов заключается в использовании прерываний с конечным автоматом. Вот минимальный пример:

Мастер

#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. Не забудьте также подключить общую электрическую землю между ардуино.

,

0

Если вы используете SPI, вы не можете использовать контакт 12 в качестве GPIO. Контакт 12 — SPI MISO.

,