Remote control and angle data displayer with Arduino Nano, MPU6050, and HC-05

Hi! I had a final project to make a portable adjustable balancing table whose picture like this.




This table was made with Arduino Nano as a controller, MPU6050 as a sensor and HC-05 as bluetooth transmitter
I also made an app in App Inventor as a "remote control" for this table. I also add angle display to make sure that this table is balanced. But when I test it, it fails to displays angle data from Arduino (in this case, angle data shown in Arduino's Serial Monitor). It has no problems if its about control the table. Here is block I've made.
Screenshot (955)

Screenshot (953)

Thanks

Hai! Saya sedang mengerjakan proyek akhir mengerjakan prototipe meja pendatar otomatis. Meja pendatar ini dilengkapi dengan Arduino Nano sebagai mikrokontroler, MPU6050 sebagai sensor, dan HC-05 sebagai konektivitas. Di aplikasi ini, saya ingin mengontrol meja pendatar (seperti selayaknya remot kontrol pada umumnya), serta menampilkan nilai sudut yang ditangkap oleh MPU6050 untuk memastikan apakah meja itu datar atau tidak. Namun setelah dicoba pada prototipe, nilai skala tidak dapat terdeteksi, sedangkan untuk fungsi sebagai "remot kontrol" masih berjalan dengan optimal. Apa penyebabnya?

Berikut ini saya lampirkan block program untuk aplikasinya.
Screenshot (955)


Screenshot (953)

Terima kasih

Are you referring to the global variables x and y?

I see you trying to pick them out of the incoming text by trying to split at spaces.

I unfortunately don't see where you display their values.

I also can't see if the text blocks that you think hold a space actually hold spaces.
AI2 has an unfortunate habit of trimming trailing spaces from text blocks , so they are completely empty (zero length).

If you split text at an empty string, the resulting list has only single letter items, with a zero length item at slot 1.

If that is not your problem, post the .ino file here in addition to the exported .aia file.

Here I attach .aia file of the app.
Remote_Control_Klon1.aia (169.2 KB)
And also the .ino file for the prototype.
sketch_aug12a.ino (5.4 KB)

I separated out the relevant parts of your .ino file for examination and discussion here ...

const int MPU_addr1 = 0x68;
float xa, ya, za, roll, pitch, gyroX, gyroY;
...
  roll = atan2(ya , za) * 180.0 / PI;
  pitch = atan2(-xa , sqrt(ya * ya + za * za)) * 180.0 / PI;

  gyroX = pitch;
  gyroY = roll ;
  
  Serial.print("sumbu X = ");
  Serial.print(gyroX,1);
  Serial.println(;);
  Serial.print(", sumbu Y = ");
  Serial.println(gyroY,1);
...
// Perintah untuk menggerakkan aktuator (bluetooth)   
  while(Serial.available()>0)
     {          
      char value = Serial.read(); // reading the data received from the bluetooth module
      Serial.println (value);
      if (value == '1'){
          digitalWrite(X1, LOW);
          digitalWrite(X2, HIGH);;          
      }
      if (value == '2'){ 
          digitalWrite(X1, HIGH);
          digitalWrite(X2, LOW);           
      }       
...

I notice a few problematic things in your print stream to Serial, which I imagine is your BlueTooth stream going to AI2 ...

  • You println between gyroX and gyroY, forcing them into separate lines, but you also include a comma between their values. This complicates parsing in AI2, which I will examine further down.
  • You include commentary (name = ...) in your print stream but you do not separate that out in Ai2. (This has all the symptoms of the two programs being written by two different people who don't talk to each other.)
  • You echo back single chaarcter BlueTooth commands back to AI2. That complicates parsing the BlueTooth input stream in AI2.

Capture
Your BlueTooth Delimiter Byte is not set to 10 (Line Feed) in the Designer.
Let's see if it is set in your blocks ...



No, you don't. That is an error.

Let's look at your blank block you use for splitting.
I used the length() block to test a copy of it.
Capture

Surprise!
A zero length. A blank would have a length of 1.

Here is a present for you, a draggable block you can pull into your Blocks Editor across browser windows ...

blocks (3)
Capture

Since all your errors come from not doing standard delimiter handling, I will give you the stock standard BlueTooth Delimiter advice now.

Please see the Delimiter article in FAQ

Be sure to use println() at the end of each message to send from the sending device, to signal end of message. Do not rely on timing for this, which is unreliable.

In the AI2 Designer, set the Delimiter attribute of the BlueTooth Client component to 10 to recognize the End of Line character.
BlueToothClient1_Properties
Also, return data is not immediately available after sending a request,
you have to start a Clock Timer repeating and watch for its arrival in the Clock Timer event. The repeat rate of the Clock Timer should be faster than the transmission rate in the sending device, to not flood the AI2 buffers.

In your Clock Timer, you should check

  Is the BlueTooth Client still Connected?
  Is Bytes Available > 0?
     IF Bytes Available > 0 THEN
       set message var  to BT.ReceiveText(-1) 

This takes advantage of a special case in the ReceiveText block:

ReceiveText(numberOfBytes)
Receive text from the connected Bluetooth device. If numberOfBytes is less than 0, read until a delimiter byte value is received.

If you are sending multiple data values per message separated by | or comma, have your message split into a local or global variable for inspection before trying to select list items from it. Test if (length of list(split list result) >= expected list length) before doing any select list item operations, to avoid taking a long walk on a short pier. This bulletproofing is necessary in case your sending device sneaks in some commentary messages with the data values.

I have tried to implement what's written in delimiter article, but it still can't works. The app still can't display data from Arduino. Even I create a new app specific for display angle data from MPU6050 it can't works too. What's wrong here. Is there I skipped some step, or I've done a wrong step?

By the way here attached my new app specific for read data from Arduino. There's some changes from previous app I've attached above. But the result still the same.
MPU6050.aia (13.0 KB)

...lots of errors just in the Blocks shown in your latest screenshot. Regarding the sending of data to the App, only send the values without any decoration/labels:
a) It is entirely unnecessary, the labels can be permanently set in the App
b) It's essential to keep the data small, the BT packet has 20 bytes for your data.

I suggest you use a bar char '|' to separate data values thus:
Serial.print(gyroX,1);
Serial.print("|");
Serial.print(gyroY,1);
Serial.println();

The time interval of the App Clock needs to be approx 20% shorter than the Loop time interval in the Sketch. The time interval in the Sketch should be the longest practical and when a sensor is involved, the time interval should be controlled using elapsed milliseconds rather than a delay()

Whatever you do, be consistent in how you format your messages and how you read them.

This is an example of doing it wrong:
Capture
Capture1

I don't know my Sudut from my sumbu, but I know how to read.

1 Like