Conveyor belt in Unity controlled by Arduino


In this arti­cle we will see a down­load­able solu­tion that con­sists of a con­vey­or belt made in Uni­ty, whose oper­a­tion is con­trolled using an Arduino plate.



In the next pack­age you will find two fold­ers, one with the Uni­ty files and one with the Arduino files.

Inside the Uni¬≠ty fold¬≠er you will find a com¬≠pi¬≠la¬≠tion to test the sim¬≠u¬≠la¬≠tion and also a Uni¬≠ty pack¬≠age that you can import into your project and access the assets of this simulation. 

GDT Con­vey­or Belt in Uni­ty Con­trolled by Arduino Shield
Ver­sion: 1.0
Pub¬≠lished: Jan¬≠u¬≠ary 28, 2020

Upload the program to the Arduino

In the down¬≠loads you will find a fold¬≠er called "Arduino", which con¬≠tains the pro¬≠gram that reads the dig¬≠i¬≠tal entries, forms a word and sends it through the ser¬≠i¬≠al port.

The pro­gram is quite sim­ple so it will work on any Arduino board you can get, in my case I used an Arduino Mega.

In the fol­low­ing video you can see how to record the pro­gram on the Arduino board, you will need the Arduino soft­ware.

Video 1: Upload the pro­gram in Arduino

Circuit for digital inputs

The Arduino pro¬≠gram that comes with the down¬≠load uses pins 2 and 3 for the dig¬≠i¬≠tal inputs. Pin 2 con¬≠trols the sta¬≠tus of the feed¬≠ing machine and pin 3 con¬≠trols the sta¬≠tus of the con¬≠vey¬≠or belt.

There are many ways to con­nect sig­nals to the Arduino's dig­i­tal input, I will show two alter­na­tives using switches.


Alternative 1: Two-position switch

In my case I used two posi¬≠tion switch¬≠es for the dig¬≠i¬≠tal inputs, in these switch¬≠es the mid¬≠dle ter¬≠mi¬≠nal makes con¬≠tact with one end or the oth¬≠er depend¬≠ing on the posi¬≠tion of the switch. There¬≠fore, at the ends we con¬≠nect the high and low volt¬≠age sig¬≠nals (in my case 5 Volts and 0 Volts respec¬≠tive¬≠ly). The mid¬≠dle ter¬≠mi¬≠nal of the switch is con¬≠nect¬≠ed to the dig¬≠i¬≠tal input of the Arduino. 

I repeat the warn¬≠ing, the switch I used is like the one shown in fig¬≠ure 1 and in this par¬≠tic¬≠u¬≠lar case it is con¬≠nect¬≠ed that way.

two-position switch for arduino digital inputs
Fig. 1: Wiring dia­gram of a two-posi­tion switch for dig­i­tal input of the Arduino

Alternative 2: Pull-up resistor switch

Per¬≠haps you only have one switch, i.e. a con¬≠tact that clos¬≠es or opens. In the Arduino's dig¬≠i¬≠tal inputs there should be con¬≠stant high or low volt¬≠age sig¬≠nals, we should not leave dig¬≠i¬≠tal inputs uncon¬≠nect¬≠ed to any¬≠thing (con¬≠nec¬≠tion to the air as we say here) as this will lead to unpre¬≠dictable behavior. 

To do this, a small cir¬≠cuit with a pull-up resis¬≠tor must be imple¬≠ment¬≠ed, as shown in fig¬≠ure 2.

In this case we use a resis­tor con­nect­ed to the GND ter­mi­nal of the Arduino and the oth­er end con­nect­ed on one side to the dig­i­tal input and on the oth­er to the switch, the oth­er end of the switch is con­nect­ed to the high volt­age sig­nal (5 Volt for example).

switch connection with pull-up resistor for arduino digital inputs
Fig. 2: Wiring dia¬≠gram of a pull-up resis¬≠tor switch for dig¬≠i¬≠tal input of the Arduino. 

The cir­cuit in fig­ure 2 works as fol­lows: when the switch is open there is no cur­rent flow­ing through the resis­tor, there­fore the 0 Volts are trans­ferred to the dig­i­tal input and the Arduino reads a low lev­el. When we acti­vate the switch the cur­rent will flow through the resis­tance and the Arduino's input will have a high lev­el signal.

Check if the Arduino program is working

The Arduino pro¬≠gram is in charge of read¬≠ing the sta¬≠tus of the dig¬≠i¬≠tal inputs, cre¬≠at¬≠ing a bina¬≠ry word that rep¬≠re¬≠sents those states and send¬≠ing it by ser¬≠i¬≠al port.

If we open the Ser¬≠i¬≠al mon¬≠i¬≠tor, from the Tools tab, we should see the states of the dig¬≠i¬≠tal mes¬≠sage inputs. As you can see in the fol¬≠low¬≠ing video. 

Video 2: Check that the Arduino pro­gram is working

Test the simulation

Once we have record­ed the pro­gram on the Arduino board, we can run the com­pi­la­tion that comes with the download.

When enter­ing the sim­u­la­tion, in the upper left cor­ner there is a but­ton to con­nect Uni­ty to the Arduino board.

In this part you may have prob¬≠lems with the con¬≠nec¬≠tion, prob¬≠a¬≠bly cor¬≠rect this in anoth¬≠er ver¬≠sion of the solu¬≠tion. To make sure the con¬≠nec¬≠tion works, the Arduino board must be con¬≠nect¬≠ed before open¬≠ing the com¬≠pi¬≠la¬≠tion and the con¬≠nec¬≠tion process may take sev¬≠er¬≠al sec¬≠onds to com¬≠plete. If after 30 sec¬≠onds the board is not con¬≠nect¬≠ed, check the pre¬≠vi¬≠ous step and reopen the sim¬≠u¬≠la¬≠tion and try again.

Video 3: Prue­ba de la cin­ta trans­porta­do­ra en Uni­ty con­tro­la­da por Arduino.

Import package and fix "API Compatibility Level" error

To access the source files of the sim¬≠u¬≠la¬≠tion is the Uni¬≠ty pack¬≠age, you can import it as seen in the fol¬≠low¬≠ing video.

Video 4: Import bun¬≠dle and fix API Com¬≠pat¬≠i¬≠bil¬≠i¬≠ty Lev¬≠el error

When import¬≠ing the pack¬≠age we will get errors because some scripts can¬≠not access the pack¬≠age with the class¬≠es that allow access to the ser¬≠i¬≠al port.

To fix this, fol­low the steps shown in video 4. Go to Edit > Project Set­tings > Play­er > Oth­er Set­tings and in the field "API Com­pat­i­bil­i­ty Lev­el" set ".NET 4.x".

How the Conveyor belt in Unity controlled by Arduino works

Inside the pack¬≠age is the scene that is seen in the sim¬≠u¬≠la¬≠tion, we can access it and see its ele¬≠ments, in fig¬≠ure 3 we can see the hier¬≠ar¬≠chy of the scene.

In the hier­ar­chy we have three machines, "Toori Machine" is the machine that places objects on the con­vey­or belt. "GDT Con­vey­or Belt" is the con­vey­or belt and "Box" is the box where the objects fall and are destroyed.

hierarchy of conveyor belt simulation in arduino controlled unity
Fig. 3: Hier¬≠ar¬≠chy of the scene that comes inside the package. 

Conveyor Belt

The con¬≠vey¬≠or belt is a 3D mod¬≠el with a struc¬≠ture and a belt. 

To achieve the ani¬≠ma¬≠tion of the oper¬≠a¬≠tion what is done is to add off¬≠set to the UV map of the tex¬≠ture. In this case, as the tex¬≠ture is ver¬≠ti¬≠cal¬≠ly dis¬≠trib¬≠uted, we add off¬≠set to the Y com¬≠po¬≠nent of the UV map. When the UV map has an off¬≠set of 1 in the Y com¬≠po¬≠nent the tex¬≠ture returns to the ini¬≠tial state.

So to achieve the effect of the con­vey­or belt mov­ing for­ward or back­ward we grad­u­al­ly increase the UV map off­set on one of the components.

To make the belt trans¬≠port objects, you have a Col¬≠lid¬≠er box in Trig¬≠ger mode that detects when an object is on the belt, these objects must have a Rigid¬≠Body com¬≠po¬≠nent assigned to them. 

Script that controls the conveyor belt in Unity.
Fig. 4: Script that con¬≠trols the con¬≠vey¬≠or belt in Unity

Then in the Con¬≠vey¬≠or Script you define the OnTrig¬≠ger¬≠Stay func¬≠tion that will be called when an object is on the con¬≠vey¬≠or belt. This func¬≠tion will be in charge of mov¬≠ing the object, to syn¬≠chro¬≠nize the move¬≠ment of the belt with the move¬≠ment of the object there is a para¬≠me¬≠ter in the inspec¬≠tor called "Syn¬≠cU¬≠VMove¬≠ment¬≠Fac¬≠tor", by default it is set to 2, as shown in fig¬≠ure 2.

The con¬≠vey¬≠or belt has a pub¬≠lic func¬≠tion that allows it to be acti¬≠vat¬≠ed or deac¬≠ti¬≠vat¬≠ed and that can be called from any oth¬≠er Script. We exe¬≠cute this func¬≠tion with the infor¬≠ma¬≠tion we read from the Arduino board, that is, it will be acti¬≠vat¬≠ed or deac¬≠ti¬≠vat¬≠ed accord¬≠ing to the sta¬≠tus of the dig¬≠i¬≠tal input 3 of the board.

Feeding Machine

To make the sim­u­la­tion a lit­tle more com­plete, a machine that places objects on the con­vey­or belt is includ­ed. This machine is con­trolled with the "Feed­ing­Ma­chine" script and also has a pub­lic method that allows you to turn it on or off. This machine will be con­trolled with the dig­i­tal input 2 of the Arduino.

Script that controls the machine that places objects on the conveyor belt in unity
Fig. 5: Script that con¬≠trols the machine that places objects on the con¬≠vey¬≠or belt

In the inspec­tor we can place the pre­fab of the objects to be placed on the con­vey­or belt and we can change the times between one object and another.

Communication between Arduino and Unity

Esta parte se resuelve uti­lizan­do una ver­sión mod­i­fi­ca­da de la solu­ción WRMHL com­par­ti­da por el equipo RELATIVTY. Te ani­mo a vis­i­tar los links para ver la solu­ción orig­i­nal y los proyectos.

This part is solved using a mod¬≠i¬≠fied ver¬≠sion of the WRMHL solu¬≠tion shared by the RELATIVTY team. I encour¬≠age you to vis¬≠it the links, see the orig¬≠i¬≠nal solu¬≠tion and the projects they have.

In order to com¬≠mu¬≠ni¬≠cate Uni¬≠ty with Arduino you must have a GameOb¬≠ject in the hier¬≠ar¬≠chy with the "wrmhlRead" script assigned. 

Fig. 6: Script that con¬≠trols com¬≠mu¬≠ni¬≠ca¬≠tion between Arduino and Unity 

I have added an inte¬≠ger called "arduinoMes¬≠sage¬≠Length" in the inspec¬≠tor, which indi¬≠cates the length of the bina¬≠ry word that is sent from the Arduino. This is used to cor¬≠rect¬≠ly syn¬≠chro¬≠nize Uni¬≠ty with Arduino in case there are more devices using the ser¬≠i¬≠al port. 

In our case, since we sent a two-dig­it word from the Arduino, you must put two in that field. If you add more dig­its to the word, you must mod­i­fy this field appropriately.

The read­ing of the Arduino mes­sage is done in the "ReadMes­sage­An­dAc­tion()" method. Here inside we can per­form the action we want in Uni­ty. In our case we exe­cute the pub­lic meth­ods of the Con­vey­or­Belt and Feed­ing­Ma­chine scripts, to acti­vate or deac­ti­vate the machines accord­ing to the Arduino's command.


We've seen how the con­vey­or belt solu­tion works at Uni­ty con­trolled by Arduino.

With the files pro¬≠vid¬≠ed you can cre¬≠ate a new sim¬≠u¬≠la¬≠tion accord¬≠ing to your needs. 

Scroll to Top
Secured By miniOrange