Управление виртуальной 3D моделью через микроконтроллер на JavaScript
Первая трудность с которой я столкнулся была совсем неочевидной я даже не думал о том что у Espruino всего один аналоговый пин, так как для моего устройства потребуется минимум два таких пина, но я не растерялся и придумал костыль.

Я решил что можно решить эту проблему путем последовательного переключения между переменными резисторами путем использования транзисторов.

Но как бы не так, транзисторы не справились с этой задачей (ибо нужна Гальваническая развязка), да и как оказалось их у меня почти не осталось для опытов.
На помощь пришла оптопара никогда до этого я ее не использовал, оказался очень даже практичный компонент.

Теперь схема выглядит так.

Теперь немного JavaScript кода, увы Espruino не поддерживает ES6.
эта функция собирает в массив информацию с единственного аналогового пина в массив, после того как 3 позиции в массиве заполнены он формируется в объект и передается в callback.
function Listener(obj, callback) { var indexPin = 0, dataPins = []; setInterval(function () { if (indexPin == 1) { digitalWrite(obj.pin3, 0); // переключаемся между пинами отключая один digitalWrite(obj.pin1, 1); // и включая следующий } if (indexPin == 2) { digitalWrite(obj.pin1, 0); digitalWrite(obj.pin2, 1); } if (indexPin == 3) { digitalWrite(obj.pin2, 0); digitalWrite(obj.pin3, 1); } if (indexPin > 2) { indexPin = 0; } indexPin++; dataPins.push(analogRead(0).toFixed(3)); // считываем пин и ограничиваем дробное до 3 чисел после точки // (чтобы не трясло) if (dataPins.length > 2) { callback({ y: dataPins[0], x: dataPins[1], z: dataPins[2] }); dataPins = []; } }, obj.speed); // скорость считывания пина }
следующая проблема с которой я столкнулся была более тривиальной это — ограниченная память микроконтроллера.
Изначально я хотел вообще хранить часть кода на ПК и запуская сервер на Node.JS хостить страничку, а на Esp только цеплять веб сокеты Страничка подгружается с GitHub но даже этой «оптимизации» не хватает чтоб записать в память весь код, уже не говоря о минификации самого JavaScript кода. поэтому устройство может работать только после загрузки в него кода и до того пока не будет отключено.

Код готовый к записи:
function Listener(obj, callback) { var indexPin = 0, dataPins = []; setInterval(function () { if (indexPin == 1) { digitalWrite(obj.pin3, 0); digitalWrite(obj.pin1, 1); } if (indexPin == 2) { digitalWrite(obj.pin1, 0); digitalWrite(obj.pin2, 1); } if (indexPin == 3) { digitalWrite(obj.pin2, 0); digitalWrite(obj.pin3, 1); } if (indexPin > 2) { indexPin = 0; } indexPin++; dataPins.push(analogRead(0).toFixed(3)); if (dataPins.length > 2) { callback({ y: dataPins[0], x: dataPins[1], z: dataPins[2] }); dataPins = []; } }, obj.speed); } function Connect(obj, callback) { const wifi = require("Wifi"); wifi.connect(obj.ssid, { password: obj.password },function(err) { if(err){return;} wifi.getIP(function(res) { console.log(res.ip); callback(); }); }); } function Server(port, callback) { const Http = require("http"); Http.createServer(callback).listen(port); } function WebSocket(port, callback) { const WS = require("ws"); const server = WS.createServer(); server.listen(port); server.on("websocket", callback); } function HTML_Page(config, req, res) { const pos = config.correction_position; const HTML = ""; res.writeHead(200, {'Content-type':'text/html'}); res.end(HTML); } function init (config) { Connect(config.wifi, function () { digitalWrite(2,0); console.log("Connect wifi: "+config.wifi.ssid); Server(config.server_port, function (req, res) { HTML_Page(config, req, res); }); Listener(config.listen_pin, function (data) { Data = data; }); WebSocket(config.socket_port,function (Ws) { Ws.on('message', function () { Ws.send(JSON.stringify(Data)); }); }); }); } /* * функция в которую передаются все * необходимые настройки для старта программы */ init({ wifi: { ssid: "Имя точки доступа", password: " Пароль точки доступа" }, socket_port: 8000, server_port: 80, listen_pin: { pin1: 13, pin2: 12, pin3: 15, speed: 30 }, correction_position: { x: 0.3, y: 0.025, z: -0.03 } // объект для коррекции позиции модели });
Минифицированный код можно найти на GitHub.
Вот так выглядит схема готового устройства.

Результат.
И еще парочка фото.


Я собирал из тех компонентов которые у меня были, а оптопару вообще мне пришлось долго искать. И они вовсе не самые оптимальные для этого устройства, поэтому не буду указывать точные названия компонентов их будет очень просто подобрать.
Поки чмоки.
Источник

Почему шестьдесят лет назад нейробиологи понимали мозг лучше, чем мы сегодня понимаем искусственный интеллект