Wi‑Fi RC-машина с беспроводной зарядкой Qi на Arduino MKR1000
Компоненты и расходники
| Набор передатчика Qi 5W (IDT P9038-R-EVK) | ×1 |
| Набор приёмника Qi 5W (IDT P9025AC-R-EVK) | ×1 |
| Arduino MKR1000 (Wi-Fi + Li-Po зарядка) | ×1 |
| Шасси 2WD для робота | ×1 |
| Драйвер двигателей L293DNE | ×1 |
| Повышающий преобразователь CN6009 (Step-up до 5В) | ×1 |
| Li-Po аккумулятор 3,7 В (минимум 700 мАч!) | ×1 |
| Диоды 1N4007 | ×8 |
| Светодиод (указатель Wi-Fi) | ×1 |
| Резистор 221 Ом | ×1 |
| Тяжелые стяжки (крепление) | ×5 |
| Макетная плата (опционально) | ×1 |
Инструменты
- Паяльник, клей-пистолет, отвёртка, мультиметр.
О проекте
Создаём Wi-Fi-управляемую машинку, которая сама заряжается беспроводно, припарковываясь на базе.
Принцип работы
- Мозг — Arduino MKR1000 (встроенный Wi-Fi и контроллер зарядки Li-Po).
- Питание — Li-Po 3,7 В. Драйвер L293DNE требует ≥4,5 В → поднимаем напряжение преобразователем CN6009 до 5 В.
- Зарядка: приёмник Qi (5 В DC) подключён к VIN/GND MKR1000. Когда машина стоит на передаточной панели — батарея заряжается автоматически.
- Управление через веб-интерфейс: кнопки Вперёд/Назад/Влево/Вправо/Стоп + два режима скорости (Fast/Slow).
Сборка железа
- Припаяйте провода к моторам и к выходам приёмника Qi (OUT+ — красный, GND — чёрный).
- Соберите схему на макетке или припойте: батарея → MKR1000 (встроенная зарядка), CN6009 (вход от батареи, выход 5 В на L293DNE), L293DNE управляет моторами.
- Внимание! Используйте Li-Po ≥700 мАч, иначе риск перегрева/взрыва.
- Настройте CN009 под 5 В (отверткой, проверяйте мультиметром на OUT+/OUT−).
- Приёмник Qi клеим на дно машины (пластиковая подкладка + силикон), провода: красный → VIN, чёрный → GND Arduino.
- Батарею и макетку затягиваем стяжками к шасси.
Программная часть — Wi-Fi
- В скетче замените
ssidиpassна свои (строки 12–13). Код заточен под WPA/WPA2; для WEP/открытой сети см. комментарии в коде (строки 34–37). - Загрузите скетч в MKR1000.
Как пользоваться
- Подключение: лучше раздать хотспот с телефона и подключить MKR1000 к нему (тогда не нужен роутер). Или подключите оба к одному роутеру.
- Узнайте IP: в настройках хотспота телефона (или в админке роутера) найдите IP платы (например, 192.168.1.1).
- Откройте браузер на телефоне и введите этот IP.
- Зарядная база: включите передаточную панель Qi от 5 В адаптера.
- Ездьте! Веб-страница даёт большие кнопки управления и выбор скорости.
Код (Arduino_IDT_Wi-Fi_Car.ino)
#include
#include
const int motor1Control = 2; // правый мотор
const int motor2Control = 3; // левый мотор
const int motor1Input1 = 4;
const int motor1Input2 = 5;
const int motor2Input1 = 8;
const int motor2Input2 = 9;
const int wifiLed = 10;
char ssid[] = "example"; // <-- ваш SSID
char pass[] = "password"; // <-- ваш пароль
int keyIndex = 0;
int status = WL_IDLE_STATUS;
String readString;
WiFiServer server(80);
String speedMode = "fast";
void setup() {
pinMode(motor1Control, OUTPUT);
pinMode(motor2Control, OUTPUT);
pinMode(motor1Input1, OUTPUT);
pinMode(motor1Input2, OUTPUT);
pinMode(motor2Input1, OUTPUT);
pinMode(motor2Input2, OUTPUT);
pinMode(wifiLed, OUTPUT);
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, pass); // WPA/WPA2
// status = WiFi.begin(ssid, keyIndex, pass); // WEP
// status = WiFi.begin(ssid); // открытая сеть
delay(10000);
}
server.begin();
digitalWrite(wifiLed, HIGH); // индикатор подключения
}
void loop() {
WiFiClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 100) readString += c;
if (c == '\n') {
// HTTP-ответ с HTML-страницей управления
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("");
client.println("FORWARDS
");
client.println("LEFT");
client.println("STOP");
client.println("RIGHT
");
client.println("BACKWARDS
");
client.println("SPEED MODES
");
client.println("FAST");
client.println("SLOW");
client.println("");
break;
}
// Разбор команд
if (readString.indexOf("?fast") > 0) { speedMode = "fast"; readString = ""; }
if (readString.indexOf("?slow") > 0) { speedMode = "slow"; readString = ""; }
if (speedMode == "fast") {
if (readString.indexOf("?moveForwards") > 0) { moveForwards(); readString = ""; }
if (readString.indexOf("?moveBackwards") > 0) { moveBackwards(); readString = ""; }
} else {
if (readString.indexOf("?moveForwards") > 0) { moveForwardsSlow(); readString = ""; }
if (readString.indexOf("?moveBackwards") > 0) { moveBackwardsSlow(); readString = ""; }
}
if (readString.indexOf("?turnLeft") > 0) { turnLeft(); readString = ""; }
if (readString.indexOf("?turnRight") > 0) { turnRight(); readString = ""; }
if (readString.indexOf("?stopMoving") > 0) { stopMoving(); readString = ""; }
}
}
delay(1);
client.stop();
}
}
// --- Функции движения ---
void moveForwards() {
digitalWrite(motor1Control, HIGH); digitalWrite(motor2Control, HIGH);
digitalWrite(motor1Input1, LOW); digitalWrite(motor1Input2, HIGH);
digitalWrite(motor2Input1, LOW); digitalWrite(motor2Input2, HIGH);
}
void moveBackwards() {
digitalWrite(motor1Control, HIGH); digitalWrite(motor2Control, HIGH);
digitalWrite(motor1Input1, HIGH); digitalWrite(motor1Input2, LOW);
digitalWrite(motor2Input1, HIGH); digitalWrite(motor2Input2, LOW);
}
void turnRight() {
analogWrite(motor1Control, 0); analogWrite(motor2Control, 200);
digitalWrite(motor1Input1, HIGH); digitalWrite(motor1Input2, LOW);
digitalWrite(motor2Input1, LOW); digitalWrite(motor2Input2, HIGH);
}
void turnLeft() {
analogWrite(motor1Control, 200); analogWrite(motor2Control, 0);
digitalWrite(motor1Input1, LOW); digitalWrite(motor1Input2, HIGH);
digitalWrite(motor2Input1, HIGH); digitalWrite(motor2Input2, LOW);
}
void stopMoving() {
digitalWrite(motor1Control, LOW); digitalWrite(motor2Control, LOW);
digitalWrite(motor1Input1, LOW); digitalWrite(motor1Input2, LOW);
digitalWrite(motor2Input1, LOW); digitalWrite(motor2Input2, LOW);
}
void moveForwardsSlow() {
analogWrite(motor1Control, 200); analogWrite(motor2Control, 200);
digitalWrite(motor1Input1, LOW); digitalWrite(motor1Input2, HIGH);
digitalWrite(motor2Input1, LOW); digitalWrite(motor2Input2, HIGH);
}
void moveBackwardsSlow() {
analogWrite(motor1Control, 200); analogWrite(motor2Control, 200);
digitalWrite(motor1Input1, HIGH); digitalWrite(motor1Input2, LOW);
digitalWrite(motor2Input1, HIGH); digitalWrite(motor2Input2, LOW);
}
Схема подключения

Производственный процесс
- Конструкторы в C#: виды, примеры и продвинутые паттерны
- Вложенные классы в C#: определение, использование и наследование
- Освоение перегрузки конструкторов в C#
- Почему IoT-устройства с Wi‑Fi создают растущую угрозу безопасности
- Премиальное точное производство деталей двигателя на токарных и фрезерных станках с ЧПУ
- Автодомкраты: виды, применение и правила безопасности
- Как быстро и безопасно устранить утечку бензина
- Как тюнинг влияет на гарантию авто: что нужно знать
- Пошаговое руководство по ремонту ручки автомобильной двери
- Быстрый гид по удалению ржавчины на кузове авто: защитите машину от коррозии