Некоторые из интересных и необычных проектов с использованием Arduino и соответствующих аксессуаров – это те, которые кажутся совершенно очевидными в непредусмотрительности. Иногда решение проблемы настолько изящно, что вам интересно, почему это никогда не приходило вам в голову раньше.

Вот и в данном случае оказывается, что можно организовать беспроводную связь с помощью ультразвуковых волн. Конечно, широкого применения в силу своих ограничений такая задумка не найдет, но, тем не менее, в некоторых случаях такое хитроумное изобретение может быть полезно.
С помощью ультразвуковых модулей приема и передачи, снятых с датчика HC-SR04, можно организовать простую настройку для использования ультразвуковых преобразователей для односторонней передачи данных. Управление передающей частью осуществляется напрямую, а для принимающей части нужно организовать подключение в соответствии с приведенной ниже схемой.

На макетке это может выглядеть так:

Вот код передающей части:
void setup()
{
Serial.begin(115200);
pinMode(3,OUTPUT);
}
void loop()
{
send("Ultrasonic communication\n");
send("Hello World\n\n");
}
void send(String msg)
{
byte ch;
unsigned int pos = 0;
unsigned int sz = msg.length();
while(pos<sz)
{
ch = msg.charAt(pos);
Serial.print((char)ch);
tone(3,40000);
delay(10);
noTone(3);
for(int i=0;i<8;i++)
{
boolean b;
b = bitRead(ch,7-i);
if(b)
{
tone(3,40000);
delay(2);
}
else
{
tone(3,40000);
delay(4);
}
noTone(3);
delay(11);
}
pos++;
}
}
Далее код принимающей части:
int pos = 0;
unsigned char CH = 0;
unsigned int bits1 = 0;
boolean capture = false;
void setup()
{
Serial.begin(115200);
pinMode(5,INPUT_PULLUP);
}
void loop()
{
if(digitalRead(5))
{
bits1 = 0;
unsigned long deltaT = millis();
while(millis()-deltaT <= 10) if(digitalRead(5)) bits1 ++;
//Serial.println(bits1);
if(capture)
{
boolean b = 0;
if(bits1 > 290 && bits1 < 600) b = 0;
if(bits1 > 20 && bits1 < 290) b = 1;
if(b) bitSet(CH,7-pos); else bitClear(CH,7-pos);
//Serial.print(b);
pos++;
if(pos == 8)
{
Serial.print((char)CH);
pos = 0;
capture = false;
}
}
if(bits1 > 600)
{
capture = true;
pos = 0;
}
}
}
© digitrode.ru