questo codice è il codice, forse devo fargli qualche ritocco sulle variabili usate nelle funzioni, ma non dovrebbe cambiare molto...
non è per arduino è per un ATtiny84... pare che funzioni, ma è dificile dirlo con certezza perchè 50ms non sono facili da notare a occhio

#include <NewSoftSerial.h>
NewSoftSerial TinySerial(0,1);
byte x=0, y=0, value[3];
boolean er=0;
unsigned long time[4];
void setup()
{
TinySerial.begin(9600);
DDRA=B00111111; // EN1=3; EN2=4; ballUS=5; LUS=6; RUS=7; FUS=8; BUS=9; LROut=10;
DDRB=B110; // RX=0; TX=1; BallOut=2;
for(y=0;y<4;y++)time[y]=0;
y=0;
}
void loop()
{
if((PINA>=B01000000)&&(er==0))
{
output:
x=PINA / B01000000;
TinySerial.print(value[x-1]);
er=1;
}
else
{
while(millis()<=time[y])
{
if(PINA<B01000000)er=0;
else if((PINA>=B01000000)&&(er==0))goto output;
}
time[y]=millis()+50;
switch(y)
{
case 0:{BallUS(); y=1;}break;
case 1:{value[2]=LRUS(value[2]); y=2;}break;
case 2:{value[1]=FUS(); y=3;}break;
case 3:{value[0]=BUS(); y=0;}break;
}
if(PINA<B01000000)er=0;
}
}
void BallUS()
{
unsigned int v;
PORTA=PORTA | B100000;
delayMicroseconds(10);
PORTA=PORTA & B1;
DDRA=B011111;
v=pulseIn(5,HIGH,1000);
v=v/58;
if((v!=0)&&(v<=10))v=1;
else v=0;
digitalWrite(2,v);
}
byte BUS()
{
unsigned int v;
PORTA=PORTA | B10;
delayMicroseconds(10);
PORTA=PORTA & B1;
DDRA=B111101;
v=pulseIn(9,HIGH,17000);
if(v==0)v=17000;
v=v/58;
if(v>255)v=255;
return v;