Jump to content
Korean Random

Arduino и аналоги


kharlashkin

Recommended Posts

Гм... Чего-то вспомнилась вот эта темка

 

Я уж позабыл, что писал ранее :)

 

Поддерживаю, хорошо было бы. Я с уважением отношусь к Блендеру и его фанам, но блендера не изучал, посему поэтому поправьте, если есть идея лучше. Осуществляем задуманное, записываем в файлик 1.txt через строку координаты всех частей тела, а потом можно включить Unity, создать сценку с таким же кол-вом костей, написать скрипт для считывания из 1.txt и творить! :)

Юньку люблю, юнька хороша. 

Edited by Pavel3333
Link to comment
Short link
Share on other sites

Юнька не универсальна, как Blender.

Не знаю к лучшему или не совсем так, но благодаря своему низкому порогу вхождения (системный python), открытости и поддержке сообщества - Blender, наверное, один из лучших и простых способов понять общую структурную модель своего проекта. Например в моем случае (платформа) это вообще единственный инструмент позволяющий "из коробки" получить полноценную реализацию общей концепции хотелок ;)

Unity же предназначена в первую очередь для создания игр, даже наверное просто для рекламы своего движка - так как любой более профессиональный функционал сразу же потребует платных плагинов или проф версию за деньги.

Осуществляем задуманное, записываем в файлик 1.txt через строку координаты всех частей тела, а потом можно включить Unity, создать сценку с таким же кол-вом костей, написать скрипт для считывания из 1.txt и творить! :)

Зачем если можно брать и отдавать данные непосредственно из com-порта?

Link to comment
Short link
Share on other sites

Наконец-то заставил Blender корректно отображать все повороты датчика (не хочу снимать видео - поздно уже):

post-19155-0-86507200-1485899993_thumb.png

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

Блин не охота всю математику перебирать в Arduino коде...

Edited by kharlashkin
  • Upvote 1
Link to comment
Short link
Share on other sites

Нашел похожий проект платформы в blender на просторах - буду изучать.

@Azbuka, Как-то давно не появлялся... Так уверенно писал о вводе/выводе в/из arduino, хотел спросить о примере реализации.

Edited by kharlashkin
  • Upvote 1
Link to comment
Short link
Share on other sites

 

 

Как-то давно не появлялся

Тут я. Мне просто нечего добавить.

 

 

Так уверенно писал о вводе/выводе в/из arduino, хотел спросить о примере реализации.

В последний раз я успешно работал с UART на AVR два или три года назад. С того момента нет ни времени, ни особого желания. Код на ассемблере и C для работы с UART как-то не работал, а поиск причины занял бы очень много времени. И что самое обидное, причиной стала бы какая-нибудь мелочь, которую я пропустил в даташите.

  • Upvote 1
Link to comment
Short link
Share on other sites

В последний раз я успешно работал с UART на AVR два или три года назад. С того момента нет ни времени, ни особого желания. Код на ассемблере и C для работы с UART как-то не работал, а поиск причины занял бы очень много времени. И что самое обидное, причиной стала бы какая-нибудь мелочь, которую я пропустил в даташите.

Так успешно или не успешно ;)

Link to comment
Short link
Share on other sites

Так успешно или не успешно

Два или три года назад все работало. Тогда я использовал или WinAVR или Atmel Studio или Bascom AVR. Уже и не вспомню.

С того момента начал использовать avr-gcc. Код на Си и ассемблере, скомпилированный им, так и не заработал. 

Edited by Azbuka
Link to comment
Short link
Share on other sites

Сегодня получил обратную связь от сервопривода. Фотографии не стал пока делать - буду перепаивать остальные сделаю обязательно.

Подопытный с коробком спичек для оценки размера

post-19155-0-38586800-1486239159_thumb.jpg

Вскрыл крышку сервы на 4-х длинных саморезах.

post-19155-0-71708600-1486239173_thumb.jpgpost-19155-0-35516300-1486239184_thumb.jpg

Запустил тестовый скетч "Sweep" из примеров и мультиметром поискал контакт с плавающим значением. Повезло и попал с первого раза :)

Место припайки

post-19155-0-33835900-1486239194_thumb.jpg

С припаянным проводком

post-19155-0-14847500-1486239206_thumb.jpg

Припаял проводок на платку, вывел наружу вместе с остальными 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 by kharlashkin
  • Upvote 1
Link to comment
Short link
Share on other sites

:no1:

Класс!

Спасибо, @Pavel3333! Хотел отметить, что обычным паяльником я бы туда не подлез никак, так что для мелких деталюшек китайская usb-поделка самое оно. Осталось самое интересное теперь - довести до ума платформу, т.е. модернизировать сервы для отдачи значений в Blender, закрепить датчики на основе и платформе. Оформить инструкцию и визуализацию.

Вчера просидел весь вечер с магнитометром, думаю нужно калибровать его ручками и немного изменять математику Arduino скетча. Кстати хорошая ссылка на инструкцию по калибровке. Если все получиться с датчиками, подумываю следующим этапом зачудить отслеживание движений человека ;)

Edited by kharlashkin
  • Upvote 1
Link to comment
Short link
Share on other sites

Добавил в сообщение о модернизации серв фото процесса, прошу камнями сильно не кидать - снимал на телефон.

Edited by kharlashkin
Link to comment
Short link
Share on other sites

  • 1 month later...

Апну темку, приехали датчик уровня СО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 by kharlashkin
  • Upvote 3
Link to comment
Short link
Share on other sites

  • 2 weeks later...

 

 

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, затем температуру и т.п.

  • Upvote 1
Link to comment
Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...