SkepticalFox Posted January 30, 2017 Share Posted January 30, 2017 (edited) . Edited January 9, 2021 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted January 30, 2017 Share Posted January 30, 2017 (edited) Гм... Чего-то вспомнилась вот эта темка Я уж позабыл, что писал ранее :) Поддерживаю, хорошо было бы. Я с уважением отношусь к Блендеру и его фанам, но блендера не изучал, посему поэтому поправьте, если есть идея лучше. Осуществляем задуманное, записываем в файлик 1.txt через строку координаты всех частей тела, а потом можно включить Unity, создать сценку с таким же кол-вом костей, написать скрипт для считывания из 1.txt и творить! :) Юньку люблю, юнька хороша. Edited January 30, 2017 by Pavel3333 @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted January 30, 2017 Share Posted January 30, 2017 (edited) . Edited January 9, 2021 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted January 30, 2017 Share Posted January 30, 2017 Юнька не универсальна, как Blender. Это да. А игру простенькую можно на нем написать и скомпилировать? @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted January 30, 2017 Share Posted January 30, 2017 (edited) . Edited January 9, 2021 by SkepticalFox 1 @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted January 30, 2017 Author Share Posted January 30, 2017 Юнька не универсальна, как Blender. Не знаю к лучшему или не совсем так, но благодаря своему низкому порогу вхождения (системный python), открытости и поддержке сообщества - Blender, наверное, один из лучших и простых способов понять общую структурную модель своего проекта. Например в моем случае (платформа) это вообще единственный инструмент позволяющий "из коробки" получить полноценную реализацию общей концепции хотелок ;) Unity же предназначена в первую очередь для создания игр, даже наверное просто для рекламы своего движка - так как любой более профессиональный функционал сразу же потребует платных плагинов или проф версию за деньги. Осуществляем задуманное, записываем в файлик 1.txt через строку координаты всех частей тела, а потом можно включить Unity, создать сценку с таким же кол-вом костей, написать скрипт для считывания из 1.txt и творить! :) Зачем если можно брать и отдавать данные непосредственно из com-порта? @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted January 30, 2017 Share Posted January 30, 2017 из com-порта? Точно, забыл. @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted January 31, 2017 Author Share Posted January 31, 2017 (edited) Наконец-то заставил Blender корректно отображать все повороты датчика (не хочу снимать видео - поздно уже): Есть небольшая проблема с данными от магнитометра в кватернионах - при повороте датчика вокруг оси Z, в течении пары секунд параметр этот возвращается обратно. Если же считывать данные магнитометра напрямую - есть конечно плаванье (в пределах 3-10 тысячных Гаусса), но показывает на север стабильно. Блин не охота всю математику перебирать в Arduino коде... Edited January 31, 2017 by kharlashkin 1 @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted February 1, 2017 Author Share Posted February 1, 2017 (edited) Нашел похожий проект платформы в blender на просторах - буду изучать. @Azbuka, Как-то давно не появлялся... Так уверенно писал о вводе/выводе в/из arduino, хотел спросить о примере реализации. Edited February 1, 2017 by kharlashkin 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted February 1, 2017 Share Posted February 1, 2017 @ Quote Link to comment Short link Share on other sites More sharing options...
Azbuka Posted February 1, 2017 Share Posted February 1, 2017 Как-то давно не появлялся Тут я. Мне просто нечего добавить. Так уверенно писал о вводе/выводе в/из arduino, хотел спросить о примере реализации. В последний раз я успешно работал с UART на AVR два или три года назад. С того момента нет ни времени, ни особого желания. Код на ассемблере и C для работы с UART как-то не работал, а поиск причины занял бы очень много времени. И что самое обидное, причиной стала бы какая-нибудь мелочь, которую я пропустил в даташите. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted February 2, 2017 Author Share Posted February 2, 2017 В последний раз я успешно работал с UART на AVR два или три года назад. С того момента нет ни времени, ни особого желания. Код на ассемблере и C для работы с UART как-то не работал, а поиск причины занял бы очень много времени. И что самое обидное, причиной стала бы какая-нибудь мелочь, которую я пропустил в даташите. Так успешно или не успешно ;) @ Quote Link to comment Short link Share on other sites More sharing options...
Azbuka Posted February 2, 2017 Share Posted February 2, 2017 (edited) Так успешно или не успешно Два или три года назад все работало. Тогда я использовал или WinAVR или Atmel Studio или Bascom AVR. Уже и не вспомню. С того момента начал использовать avr-gcc. Код на Си и ассемблере, скомпилированный им, так и не заработал. Edited February 2, 2017 by Azbuka @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted February 3, 2017 Author Share Posted February 3, 2017 (edited) Сегодня получил обратную связь от сервопривода. Фотографии не стал пока делать - буду перепаивать остальные сделаю обязательно. Подопытный с коробком спичек для оценки размера Вскрыл крышку сервы на 4-х длинных саморезах. Запустил тестовый скетч "Sweep" из примеров и мультиметром поискал контакт с плавающим значением. Повезло и попал с первого раза :) Место припайки С припаянным проводком Припаял проводок на платку, вывел наружу вместе с остальными 3-мя, опять проверил мультиметром - все работает, показывало плавающие значения по памяти вроде от 0,7 до 2,1 В. Собственно проверочный код: #include <Servo.h> Servo myservo; int pos = 0; int analogPin = 3; int val = 0; void setup() { myservo.attach(9); Serial.begin(9600); } void loop() { for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); val = analogRead(analogPin); Serial.println(val); delay(50); } for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); val = analogRead(analogPin); Serial.println(val); delay(50); } } И вывод в порт: 449 449 449 449 445 444 441 440 438 436 435 433 431 429 428 426 424 423 421 419 417 523 414 522 410 514 407 406 403 401 399 397 396 394 392 390 389 387 385 384 381 380 377 376 374 372 371 369 368 366 422 362 464 358 458 355 369 351 351 348 346 345 343 341 339 337 335 333 331 329 328 327 325 324 321 319 318 316 313 312 310 399 307 398 304 393 299 385 295 295 292 290 286 284 282 280 278 277 275 273 271 269 267 265 263 261 259 257 256 254 288 250 333 245 326 242 240 238 236 233 231 230 228 226 223 222 220 218 216 214 212 210 208 206 204 202 199 199 196 194 192 260 188 261 184 254 180 178 175 173 172 170 168 166 164 161 160 158 155 153 152 150 148 146 144 141 139 137 135 133 132 129 194 125 188 120 181 116 112 111 109 108 108 108 109 113 115 117 120 121 124 127 128 131 132 134 136 139 141 143 145 146 149 224 153 229 157 160 161 164 166 168 169 172 173 175 178 180 181 184 185 188 190 192 194 196 198 200 202 204 206 208 209 211 268 215 218 219 305 223 225 227 229 231 233 236 237 239 240 242 244 247 249 251 252 253 256 259 260 262 264 266 268 271 271 273 276 368 279 376 283 375 286 290 290 293 294 296 298 300 302 303 305 308 310 311 313 315 317 318 320 322 324 326 328 330 331 333 384 337 442 340 446 344 445 348 351 352 354 356 357 359 361 362 365 366 368 370 372 374 376 377 380 381 383 385 386 389 390 392 393 500 396 510 400 509 404 511 407 410 411 413 414 417 419 420 422 423 425 428 428 431 432 434 436 438 439 441 443 444 446 448 448 449 Учитывая, что аналоговый вход в ардуинке понимает 0 В как 0, а 5 вольт как 1023, то можно рассчитать, что забираются с сервы значения от 0,53 до 2,2 вольт или получается точность 0,53 градуса. Видно из лога, что есть неточности - но учитывая стоимость серв лучшего и ждать нельзя было ;) Edited February 4, 2017 by kharlashkin 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted February 3, 2017 Share Posted February 3, 2017 Класс! @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted February 3, 2017 Author Share Posted February 3, 2017 (edited) Класс! Спасибо, @Pavel3333! Хотел отметить, что обычным паяльником я бы туда не подлез никак, так что для мелких деталюшек китайская usb-поделка самое оно. Осталось самое интересное теперь - довести до ума платформу, т.е. модернизировать сервы для отдачи значений в Blender, закрепить датчики на основе и платформе. Оформить инструкцию и визуализацию. Вчера просидел весь вечер с магнитометром, думаю нужно калибровать его ручками и немного изменять математику Arduino скетча. Кстати хорошая ссылка на инструкцию по калибровке. Если все получиться с датчиками, подумываю следующим этапом зачудить отслеживание движений человека ;) Edited February 3, 2017 by kharlashkin 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted February 3, 2017 Share Posted February 3, 2017 зачудить отслеживание движений человека ;) That's cool, как говорится! Удачи!:) 1 @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted February 4, 2017 Author Share Posted February 4, 2017 (edited) Добавил в сообщение о модернизации серв фото процесса, прошу камнями сильно не кидать - снимал на телефон. Edited February 4, 2017 by kharlashkin @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted March 13, 2017 Author Share Posted March 13, 2017 (edited) Апну темку, приехали датчик уровня СО2 и пыли (MH-Z19 и DSM501A). Несколько вечеров копался в коде/игрался настройками, собственно результат ниже: // Подключение Pin_3 DSM501A к Arduino 5В // Подключение Pin_5 DSM501A к Arduino GND // Подключение Pin_4 DSM501A к Arduino D8 // Подключение Vin MH-Z19 к Arduino 5В // Подключение GND MH-Z19 к Arduino GND // Подключение PWM MH-Z19 к Arduino D3 #define co2Pin 3 // Назначение пина подключения датчика СО2 #define dustPin 8 // Назначение пина подключения датчика пыли unsigned long duration; unsigned long starttime_dust; unsigned long endtime_dust; unsigned long sampletime_dust = 30000; // Время измерения пыли в мс unsigned long lowpulseoccupancy = 0; long highlevel_co2; long lowlevel_co2; long starttime_co2; long endtime_co2; long sampletime_co2 = 1004; // Время измерения СО2 в мс float ratio_dust = 0; float concentration_dust = 0; float pcsl = 0; float ppmco2 = 0; void setup() { Serial.begin(9600); pinMode(dustPin, INPUT); pinMode(co2Pin, INPUT); starttime_dust = millis(); starttime_co2 = millis(); } void loop() { duration = pulseIn(dustPin, LOW); lowpulseoccupancy = lowpulseoccupancy + duration; // Счетчик продолжительности импульсов endtime_dust = millis(); endtime_co2 = millis(); if ((endtime_dust - starttime_dust) >= sampletime_dust) { dust_concentration(lowpulseoccupancy); // Вызов функции расчета количества частиц на литр lowpulseoccupancy = 0; // Обнуление счетчика starttime_dust = millis(); } if ((endtime_co2 - starttime_co2) >= sampletime_co2) { co2_concentration(); // Вызов функции расчета СО2 starttime_co2 = millis(); } } void dust_concentration(unsigned long lowpulseoccupancy) { ratio_dust = lowpulseoccupancy / (sampletime_dust * 10.0); // Значение в процентах от 0 до 100 concentration_dust = 1.1 * pow(ratio_dust, 3) - 3.8 * pow(ratio_dust, 2) + 520 * ratio_dust + 0.62; // Расчет количества на куб.фут pcsl = concentration_dust / 0.2831685; // Перевод куб.фут в литр Serial.print("pcsl:"); Serial.println(pcsl); } void co2_concentration() { highlevel_co2 = pulseIn(co2Pin, HIGH, 1004000) / 1000; // Получение длины импульса HIGH в мс lowlevel_co2 = sampletime_co2 - highlevel_co2; // Расчет длины импульса LOW в мс ppmco2 = 5000 * (highlevel_co2 - 2) / (highlevel_co2 + lowlevel_co2 - 4); // Расчет концентрации СО2 Serial.print("ppm:"); Serial.println(ppmco2); } Жду остальные посылки с температурными датчиками и т.д. P.S. Заметил глюк, в датчике СО2 стоит LED-нагреватель, который периодически включается/выключается. Во время его работы + так же запитан датчик пыли (тоже со встроенным нагревателем), светодиоды на ардуинке заметно тускнеют - питание просаживается. Если в этот момент времени идет передача данных в Serial - следующее значение ppmco2 будет равно -10, т.е. импульс не был посчитан. Хорошо что блок питания 5В у меня отдельный будет для автоматики ;) Edited March 25, 2017 by kharlashkin 3 @ Quote Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted March 25, 2017 Author Share Posted March 25, 2017 P.S. Заметил глюк, в датчике СО2 стоит LED-нагреватель, который периодически включается/выключается. Во время его работы + так же запитан датчик пыли (тоже со встроенным нагревателем), светодиоды на ардуинке заметно тускнеют - питание просаживается. Если в этот момент времени идет передача данных в Serial - следующее значение ppmco2 будет равно -10, т.е. импульс не был посчитан. Ну в общем всё не так. И скетч не правильный, непонятно почему меня никто не ткнул носом в мою необразованность. По-порядку. Контроллер не умеет работать в несколько потоков и параллельно выполнять разные функции. Т.е. при выполнении например этого: duration = pulseIn(dustPin, LOW); Код будет ожидать окончания импульса, а в даташите указываются длины импульсов 10-90 мс (страница 3), таким образом весь процесс будет тормозиться. А для этого: highlevel_co2 = pulseIn(co2Pin, HIGH, 1004000) / 1000; // Получение длины импульса HIGH в мс Мы вообще тормозим всё на 1004 мс. Т.е. мне пришлось переделывать почти всё (благо пример для mh-z19 pwm был изначально правильно написан), пока не проверю получаемый данные в паре и по отдельности датчиков выкладывать не буду. У всех прошу прощения за ввод в заблуждение. Сейчас крутиться тестовый скетч, но через сутки начинает врать датчик СО2. Приехали датчики температуры и влажности dth-22 (даташит). Но все примеры и поиск на github построены с помощью delay(), а это значит что придется опять "изобретать велосипед". С другой стороны, никто не мешает мне вызывать функции в определенное время, т.е. сначала выполняем подсчет пыли, потом меряем СО2, затем температуру и т.п. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.