• InteractivitySolved
  • How do I make Bela receive serial communication from arduino within pure data?

ok thanks that's available for everyone on the dev branch now. If you update your board to that, you will no longer need the cpp file in the project and the update will apply across all projects.

    2 months later

    What if I don't want to connect via the USB cable, but instead via the Arduino Tx and Rx pins? Could I connect those pins (with a logic level shifter?) to the Bela somehow and have at least one-way serial communication from the Arduino to PD on the Bela? Which pins would I use in the Bela? And how would I define the serial port in PD?

    Yes that's doable. On the software side, the latest dev branch of the Bela core code contains example PureData/uart-communication. Make sure you update your board to the latest dev branch following the instructions here.

    Hardware-wise, if your Arduino has 3.3V signal levels, then you can connect the two directly. If your Arduino has 5V signal levels, on the other hand, you need some way of adapting that voltage to Bela's 3.3V. A dedicate logic level shifter IC would be the ideal solution, but you could toy around with a passive one, too. Remember that Bela cannot take unbound current from 5V sources into its pins, so protection is needed.

    For 5V Arduino -> 3.3V Bela you could try something like this:

    Arduino
      Tx---+
           |                  
           R1 4k7
           |          Bela
           +-----------Rx
           |
           R2 8k2
           |
          GND

    R1 and R2 is the resistor divider with gain R2/(R1+R2) and R1's high value doubles up as a current limiter. Values are not critical, but keep R1 > 1k and pick R2 so that R2/(R1+R2) * 5V is between 2.7V and 3.3V.

    Passive level shifting to go from Bela's Tx at 3.3V to Arduino's Rx at 5V is not possible, but it may be that there is no need for level shifting: the ATMEGA328p's datasheet states in table 28.2 "DC CHARACTERISTICS" that an input can be registered as HIGH if it's as low as 0.6Vcc, i.e.: 0.65 = 3.0V. So it may just work with a direct connection. However, I'd add some protection to avoid burning Bela in case the Arduino pin sends out 5V at some point, either during boot or because of a but in the fw. Put 10k in series and that should be more than enough.

      giuliomoro
      Hi! Just to know: if we update Bela Board from IDE (or other ways) - at present 8h - do we get this update of render.cpp for serial communication or we need to getting it by hand?

      If you update to the dev branch, then it's already there.

      giuliomoro I have a 5v arduino mega, because my sensors are 5v and also need the interrupt ports because of the speed. Would either of these level shifters work?

      https://www.sparkfun.com/products/12009
      https://www.adafruit.com/product/395

      In Bela, can I use any of the digital pins for Rx, or do I need to use one specifically?

      And in PD, which port do I use instead of /dev/ttyUSB0 in your example above? [new myserial /dev/ttyUSB0 9600 newline floats( or how do I find a list of available ports in PD?

        giuliomoro If your Arduino has 5V signal levels, on the other hand, you need some way of adapting that voltage to Bela's 3.3V.

        Also, here you're talking about the digital pins, right? Because I have the following working using the analog input pin with 5v. If you press the button, both LEDs light up at the same time. Is my setup here going to be problematic in the long run?

        On the Arduino:
        `#include <EasyButton.h>

        #define BUTTON_PIN 6
        #define LED_PIN 8
        #define BELA_PIN 10
        #define BAUDRATE 9600

        EasyButton button(BUTTON_PIN);

        // Callback function to be called when the button is pressed.
        void onPressed()
        {
        Serial.println("Button pressed");
        }

        void setup()
        {
        Serial.begin(BAUDRATE);
        pinMode(LED_PIN, OUTPUT);
        pinMode(BELA_PIN, OUTPUT);

        button.begin();
        button.onPressed(onPressed);
        }

        void loop()
        {
        button.read(); // Continuously read the status of the button.

        // light the LED if pressed
        if(button.isPressed()){
        digitalWrite(LED_PIN, LOW);
        digitalWrite(BELA_PIN, HIGH);
        } else {
        digitalWrite(LED_PIN, HIGH);
        digitalWrite(BELA_PIN, LOW);
        }
        }
        `

        On the Bela Mini with Pd:

          drumminhands Would either of these level shifters work?

          I think so. Or you can try the passive solution proposed above first and see if it works well enouhg.

          drumminhands In Bela, can I use any of the digital pins for Rx, or do I need to use one specifically?

          You can only use dedicated UART pins. There are three sets on BelaMini , but only UART 4 does not have any conflicts:
          That's on P2.05 (Rx) and P2.07 (Tx). To enable these, run:

          config-pin P2.05 uart;
          config-pin P2.07 uart;

          in the Bela IDE's console.

          drumminhands And in PD, which port do I use instead of /dev/ttyUSB0 in your example above? [new myserial /dev/ttyUSB0 9600 newline floats( or how do I find a list of available ports in PD?

          If using UART4, use /dev/ttyS4.

          drumminhands Also, here you're talking about the digital pins, right?

          Yes, the 3.3V limit applies to all pins on the P1 and P2 headers (actually, some have even lower 1.8V limits).

          4 months later

          @giuliomoro Hi! I am doing something similar and came across this thread. I am sending values for two variables using Arduino uno.
          I am using this PD. However, I am unable to see any values in output console. I get following:
          Running project ...
          Running Pd 0.51-4
          Audio channels in use: 2
          Analog channels in use: 8
          Digital channels in use: 16
          No MIDI device enabled
          Error from tcgetattr: Input/output error
          Error tcgetattr: Input/output error
          pd 0.51.4
          bonk version 1.5
          fiddle version 1.1 TEST4
          pique 0.1 for PD version 23
          sigmund~ version 0.07

          I am not sure what exactly needs in my current patch...what could possibly cause this issue?

          giuliomoro Yes.. Just enabled it..added the below in uEnv
          uboot_overlay_addr2=/lib/firmware/BB-BELA-00A1.dtbo
          uboot_overlay_addr3=/lib/firmware/BB-BELA-CTAG-SPI-00A0.dtbo
          uboot_overlay_addr4=/lib/firmware/BB-UART4-00A0.dtbo

          but no output prints in console

          Running project ...
          Running Pd 0.51-4
          Audio channels in use: 2
          Analog channels in use: 8
          Digital channels in use: 16
          No MIDI device enabled
          pd 0.51.4
          bonk version 1.5
          fiddle version 1.1 TEST4
          pique 0.1 for PD version 23
          sigmund~ version 0.07
          root@bela ~/Bela#

          at least the error went away. What are you sending to it and how are you wiring your device? I recommend you use 'none' instead of 'newline' until you figure out that the basics are working.