Как передавать данные между 2 платами ардуино?

Тема в разделе "Arduino & Shields", создана пользователем mankovskaya, 6 дек 2018.

  1. mankovskaya

    mankovskaya Нуб

    Подскажите, у меня 2 платы ардуино. К первой подключена камера ov7670 и датчики, а к другой Ethernet Shield который передает данные на веб сервер. Нужно передать данные с датчиков и камеры с одной платы на другую по UART или другим возможным способом, и в идеале данные с камеры записать в файл с расширением jpeg.

    Код сьемки фото прилагается

    Код (C++):
    // Pins configurations:
    // SDA/SIOD ---> pin A4 (for Arduino UNO) | pin 20/SDA (for Arduino MEGA)
    // SCL/SIOC ---> pin A5 (for Arduino UNO) | pin 21/SCL (for Arduino MEGA)
    // MCLK/XCLK --> pin 11 (for Arduino UNO) | pin 10 (for Arduino MEGA)
    // PCLK -------> pin 2
    // VS/VSYNC ---> pin 3
    // HS/HREF ----> pin 8
    // D0 ---------> pin A0
    // D1 ---------> pin A1
    // D2 ---------> pin A2
    // D3 ---------> pin A3
    // D4 ---------> pin 4
    // D5 ---------> pin 5
    // D6 ---------> pin 6
    // D7 ---------> pin 7

    #include <Wire.h>

    #define CAMERA_ADDRESS 0x21

    // Definitions of functions for manipulating the Arduino boards pins according to each Arduino board registers, so the code will work for both Arduino UNO and Arduino MEGA:
    // The only change is the connections of the SDA/SIOD, SCL/SIOC and MCLK/XCLK pins to each board (see the pins configurations above).
    #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // If you are using Arduino MEGA the IDE will automatically define the "__AVR_ATmega1280__" or "__AVR_ATmega2560__" constants.
    #define TIMER2_PWM_A_PIN_MODE_OUTPUT() ({ DDRB |= 0b00010000; })
    #define PIN2_DIGITAL_READ() ({ (PINE & 0b00010000) == 0 ? LOW : HIGH; })
    #define PIN3_DIGITAL_READ() ({ (PINE & 0b00100000) == 0 ? LOW : HIGH; })
    #define PIN4_DIGITAL_READ() ({ (PING & 0b00100000) == 0 ? LOW : HIGH; })
    #define PIN5_DIGITAL_READ() ({ (PINE & 0b00001000) == 0 ? LOW : HIGH; })
    #define PIN6_DIGITAL_READ() ({ (PINH & 0b00001000) == 0 ? LOW : HIGH; })
    #define PIN7_DIGITAL_READ() ({ (PINH & 0b00010000) == 0 ? LOW : HIGH; })
    #define PIN8_DIGITAL_READ() ({ (PINH & 0b00100000) == 0 ? LOW : HIGH; })
    #define PINA0_DIGITAL_READ() ({ (PINF & 0b00000001) == 0 ? LOW : HIGH; })
    #define PINA1_DIGITAL_READ() ({ (PINF & 0b00000010) == 0 ? LOW : HIGH; })
    #define PINA2_DIGITAL_READ() ({ (PINF & 0b00000100) == 0 ? LOW : HIGH; })
    #define PINA3_DIGITAL_READ() ({ (PINF & 0b00001000) == 0 ? LOW : HIGH; })
    #elif defined(__AVR_ATmega328P__) // If you are using Arduino UNO the IDE will automatically define the "__AVR_ATmega328P__" constant.
    #define TIMER2_PWM_A_PIN_MODE_OUTPUT() ({ DDRB |= 0b00001000; })
    #define PIN2_DIGITAL_READ() ({ (PIND & 0b00000100) == 0 ? LOW : HIGH; })
    #define PIN3_DIGITAL_READ() ({ (PIND & 0b00001000) == 0 ? LOW : HIGH; })
    #define PIN4_DIGITAL_READ() ({ (PIND & 0b00010000) == 0 ? LOW : HIGH; })
    #define PIN5_DIGITAL_READ() ({ (PIND & 0b00100000) == 0 ? LOW : HIGH; })
    #define PIN6_DIGITAL_READ() ({ (PIND & 0b01000000) == 0 ? LOW : HIGH; })
    #define PIN7_DIGITAL_READ() ({ (PIND & 0b10000000) == 0 ? LOW : HIGH; })
    #define PIN8_DIGITAL_READ() ({ (PINB & 0b00000001) == 0 ? LOW : HIGH; })
    #define PINA0_DIGITAL_READ() ({ (PINC & 0b00000001) == 0 ? LOW : HIGH; })
    #define PINA1_DIGITAL_READ() ({ (PINC & 0b00000010) == 0 ? LOW : HIGH; })
    #define PINA2_DIGITAL_READ() ({ (PINC & 0b00000100) == 0 ? LOW : HIGH; })
    #define PINA3_DIGITAL_READ() ({ (PINC & 0b00001000) == 0 ? LOW : HIGH; })
    #endif


    void initializePWMTimer() {
      cli();
      TIMER2_PWM_A_PIN_MODE_OUTPUT(); // Set the A PWM pin of TIMER2 to output
      ASSR &= ~(_BV(EXCLK) | _BV(AS2));
      TCCR2A = (1 << COM2A0) | (1 << WGM21) | (1 << WGM20);
      TCCR2B = (1 << WGM22) | (1 << CS20);
      OCR2A = 0;
      sei();
    }

    byte readCameraRegister(byte registerId) {
      Wire.beginTransmission(CAMERA_ADDRESS);
      Wire.write(registerId);
      Wire.endTransmission();
      Wire.requestFrom(CAMERA_ADDRESS, 1);
      while (Wire.available() <= 0);
      byte registerValue = Wire.read();
      delay(1);
      return registerValue;
    }

    void writeCameraRegister(byte registerId, byte registerValue) {
      Wire.beginTransmission(CAMERA_ADDRESS);
      Wire.write(registerId);
      Wire.write(registerValue);
      Wire.endTransmission();
      delay(1);
    }

    void captureFrame(unsigned int frameWidth, unsigned int frameHeight) {
      Serial.print("*RDY*"); // send to the frame capture software a "start of frame" message for beginning capturing

      delay(1000);

      cli(); // disable all interrupts during frame capture (because it needs to be as fast as possible)
      while (PIN3_DIGITAL_READ() == LOW); // wait until VS/VSYNC pin is high
      while (PIN3_DIGITAL_READ() == HIGH); // wait until VS/VSYNC pin is low
      unsigned int tempWidth = 0;
      while (frameHeight--) {
        tempWidth = frameWidth;
        while (tempWidth--) {
          while (PIN2_DIGITAL_READ() == LOW); // wait until PCLK pin is high
          while (PIN2_DIGITAL_READ() == HIGH); // wait until PCLK pin is low
          byte byteToWrite = 0b00000000;
          byteToWrite |= ((PIN7_DIGITAL_READ() == HIGH) << 7);
          byteToWrite |= ((PIN6_DIGITAL_READ() == HIGH) << 6);
          byteToWrite |= ((PIN5_DIGITAL_READ() == HIGH) << 5);
          byteToWrite |= ((PIN4_DIGITAL_READ() == HIGH) << 4);
          byteToWrite |= ((PINA3_DIGITAL_READ() == HIGH) << 3);
          byteToWrite |= ((PINA2_DIGITAL_READ() == HIGH) << 2);
          byteToWrite |= ((PINA1_DIGITAL_READ() == HIGH) << 1);
          byteToWrite |= ((PINA0_DIGITAL_READ() == HIGH));
          UDR0 = byteToWrite; // send data via serial connection with UART register (we need to use the serial register directly for fast transfer)
          while (PIN2_DIGITAL_READ() == LOW); // wait until PCLK pin is high
          while (PIN2_DIGITAL_READ() == HIGH); // wait until PCLK pin is low
          // ignore each second byte (for a grayscale image we only need each first byte, which represents luminescence)
        }
      }
      sei(); // enable all interrupts
     
      delay(1000);
    }


    void setup() {
      initializePWMTimer();
      Wire.begin();
      Serial.begin(1000000); // the frame capture software communicates with the Arduino at a baud rate of 1MHz
    }

    void loop() {
      captureFrame(640, 480); // capture a frame at QVGA resolution (640 x 480)
    }
     
  2. DetSimen

    DetSimen Guest

    а разрешение у камеры какое?
     
  3. DetSimen

    DetSimen Guest

    и данные с камеры в каком виде приходют?
     
  4. Airbus

    Airbus Радиохулиган Модератор

    По моему ардуино-здесь лишнее звено?Камеры и пишут сами и инет транслируют сами.У меня так во всяком случае.
     
  5. mankovskaya

    mankovskaya Нуб

    максимальное разрешение 640х480 точек
     
  6. mankovskaya

    mankovskaya Нуб

    какая у вас интересная камера, часом не ov7670?
     
  7. mankovskaya

    mankovskaya Нуб

    Код (C++):
    void captureFrame(unsigned int frameWidth, unsigned int frameHeight) {
      Serial.print("*RDY*"); // send to the frame capture software a "start of frame" message for beginning capturing

      delay(1000);

      cli(); // disable all interrupts during frame capture (because it needs to be as fast as possible)
      while (PIN3_DIGITAL_READ() == LOW); // wait until VS/VSYNC pin is high
      while (PIN3_DIGITAL_READ() == HIGH); // wait until VS/VSYNC pin is low
      unsigned int tempWidth = 0;
      while (frameHeight--) {
        tempWidth = frameWidth;
        while (tempWidth--) {
          while (PIN2_DIGITAL_READ() == LOW); // wait until PCLK pin is high
          while (PIN2_DIGITAL_READ() == HIGH); // wait until PCLK pin is low
          byte byteToWrite = 0b00000000;
          byteToWrite |= ((PIN7_DIGITAL_READ() == HIGH) << 7);
          byteToWrite |= ((PIN6_DIGITAL_READ() == HIGH) << 6);
          byteToWrite |= ((PIN5_DIGITAL_READ() == HIGH) << 5);
          byteToWrite |= ((PIN4_DIGITAL_READ() == HIGH) << 4);
          byteToWrite |= ((PINA3_DIGITAL_READ() == HIGH) << 3);
          byteToWrite |= ((PINA2_DIGITAL_READ() == HIGH) << 2);
          byteToWrite |= ((PINA1_DIGITAL_READ() == HIGH) << 1);
          byteToWrite |= ((PINA0_DIGITAL_READ() == HIGH));
          UDR0 = byteToWrite; // send data via serial connection with UART register (we need to use the serial register directly for fast transfer)
          while (PIN2_DIGITAL_READ() == LOW); // wait until PCLK pin is high
          while (PIN2_DIGITAL_READ() == HIGH); // wait until PCLK pin is low
          // ignore each second byte (for a grayscale image we only need each first byte, which represents luminescence)
        }
      }
    исходя из кода выше, в виде 8 бит двоичного кода
     
  8. parovoZZ

    parovoZZ Гуру

    Если даже не понимаешь, как перегоняются данные по UART, зачем лезть в дебри, в которых даже с помощью форума не вывезешь? В китае такая камера стоит полтора рубля. Купи и не мучай моск.
     
  9. mankovskaya

    mankovskaya Нуб

    люблю советы по делу)
    вот только интересно какую камеру вы имеете в виду?
     
  10. parovoZZ

    parovoZZ Гуру

    ни за что не поверю, что девушка смогла набрать код обработки сигнала с камеры и не может разобраться с UART.
    http://forum.amperka.ru/threads/Передать-данные-от-arduino-nano-в-esp32.16946/#post-194659
    ССЫЛКИ НА АЛИК не даю, но там рассадник на любой цвет и кошелек
     
  11. mankovskaya

    mankovskaya Нуб

    название, параметры, ты о чем блин?! какая камера ?! которая сразу в инет шлет? так нужно писать об этом я мысли не читаю!
    И если тебе нечего сказать по делу, нечем помочь человеку который пытаться разобраться то сиди молча.Не трать мое время и нервы.
     
  12. DetSimen

    DetSimen Guest

    ты подумай башкой, посчитай сколько байт памяти занимает картинка 640х480 точек по 4 байта на точку?
    Да даже по 1-му байту на точку. Соотнеси это с 2048 байт памяти, имеющейся у Ардуино и дай себе ответ сама, возможно ли то, чотыхошь.
     
  13. parovoZZ

    parovoZZ Гуру

    тебе надо или мне? В нужное русло направлю, но плыть - не поплыву..
    задача как поставлена?
    как работать с UART - ссылка чуть выше.
    я тоже
    Это твой код? Что здесь происходит можешь сказать?
    Код (C++):
    void initializePWMTimer() {
      cli();
      TIMER2_PWM_A_PIN_MODE_OUTPUT(); // Set the A PWM pin of TIMER2 to output
      ASSR &= ~(_BV(EXCLK) | _BV(AS2));
      TCCR2A = (1 << COM2A0) | (1 << WGM21) | (1 << WGM20);
      TCCR2B = (1 << WGM22) | (1 << CS20);
      OCR2A = 0;
      sei();
    }
    И почему комментарии на инглише? Идешь за помощью на русскоязычный форум, а комментарии к коду на ангельском. Зачем?
     
  14. DetSimen

    DetSimen Guest

    потомушта код чеснасжыженый.
     
    parovoZZ нравится это.
  15. Igor68

    Igor68 Гуру

    5 копеек:
    - Вы умеете принимать байты с 1-ардуины во 2-ю
    - В ардуинах есть место для размещения образа (кадра с камеры)
    если нет этого места, то и конвертировать файл в JPG и т.п. Вам не удастся в памяти. Не знаю что за возможности, но думаю можете сохранять данные через файлы на SD.
    - Если нет возможности с памятью, то готовы ли Вы передавать побайтно или малыми блоками на сервер, который примет картинки и датчики.
    - готовы ли Вы сделать протокол обмена между ардуинами, что бы отличать байты от камеры и датчиков... и даже координаты на картинке. Работа с этой камерой тут:
    https://voltiq.ru/camera-ov7670-connecting-to-arduino/
    А вот куда картинка размещается в ардуине? 640х480х<байт/бит на пиксель> Может и выйдет если пиксель один бит(чёрный и белый = 0 или 1) тогда (640х480)/8 = 38400 байт в котором 8 бит, т.е. пиксель Учитесть тогда "усреднять" картинку - серое это чередование чёрных и белых как раньше в газетах. А вот уже для просто чёно-серо-белого это 307200 байт. В ардуине столько ОЗУ есть?
    - Предположим будете читать побайтно с камеры, а как ранее говорилось надо знать в каком он месте по XY, может даже и цвет 3 байта. То готовы ли вы по 1...20(образно говоря) передавать на сервер хоть по PUT или GET, а может WEBSOCKET или т.п и ещё с идентификацией не только координат, но данных с датчиков. Долго будет и вовсе не JPG (надо упаковать сначала) А у Вас ни памяти ни скорости на ардуинах. Это не светодиоды включать-выключать.
    А вообще-то смотрите примеры работы с последовательным портом. Но учтите заставлять муху выполнять работу слона это подвиг. Наверное время неограничено?
     
    Последнее редактирование: 6 дек 2018
    parovoZZ и DetSimen нравится это.
  16. DetSimen

    DetSimen Guest

    особенна, про jpeg мне понравилось
     
    parovoZZ нравится это.
  17. DetSimen

    DetSimen Guest

    Да, вангую, очередной студент, с очередным курсовиком, решивший прикинуться вагиноносителем, типа им помогают охотнее.
     
    Igor68 нравится это.
  18. b707

    b707 Гуру

    а че нет? :) я лично все комменты всегда по-английски пишу. Зато они потом в любом редакторе или вьювере читаются, а кириллица - сплошные крокозябры
     
    Igor68 нравится это.
  19. DetSimen

    DetSimen Guest

    судя по всему, оно обиделось на вас, пративных.
     
  20. parovoZZ

    parovoZZ Гуру

    ну ты ж не ноешь, что даташиты для тебя недоступны, потому что на неведомом английском.