Секундомер для... Биатлона Копосов Д.Г. / 21.06.2015 В этом году у нас, как говорят, «дошли руки» до давнишней проблемы: автоматический секундомер на Arduino для соревнований по LEGO-робототехнике. В частности, нужен был для "Линии" и "Биатлона". Прогнозировались очень плотные результаты (в частности для Биатлона в районе 14:00 с точностью до сотых). Какой уж тут человеческий фактор с секундомером в руках. Хорошая задача для школьников!Начали процесс, не слишком форсируя события. Хотели сначала на ультразвуковом датчике сделать, но дети опытные и сразу забраковали идею. Сказали, что с лазерами красивее. В принципе, все идеи видны на фото и видео.У нас уже были три 3D-принтера и можно было много экспериментировать. Это первая рабочая модель. Стилизацию дети сотворили прикольную, но очень важную. Этот чудный рычаг на самом деле reset. Проехал участник - нажал сброс.Что выскочило/выпрыгнуло очень неожиданно, как гром? А китайские ардуинки безбожно врали время. Нам надо было 6 штук таких секундомеров, а они, эти дешевые китайские аналоги, врали "кто в лес, кто по дрова". Упс. 6 штук свободных одинаковых плат у нас не оказалось. Время поджимало... Спасла Амперка. Узнав, зачем нам неожиданно понадобилось оборудование, нам сразу пришла вожделенная посылка. Спасибо!В результате все стало выглядеть... как-то так:Моделировали коробки ребята в OpenSCAD. Сама программа для Arduino несложная (7-классники разобрались).#include #include LiquidCrystal_I2C lcd(0x27,16,2); int delta1, delta2, set1, set2; float time, seconds,reset_time;boolean flag=0;void setup() { lcd.init(); lcd.backlight(); lcd.print("RoboNord-2015"); delay (1000); lcd.clear(); lcd.home(); lcd.print("Ready"); set1=analogRead(A0); delta1 = analogRead(A0)-set1; //лазер попадает while (abs(delta1)<100) {delta1 = analogRead(A0)-set1;} //лазер перекрыли? ждем 5 с, чтобы проехал... reset_time=millis(); lcd.clear(); while (seconds<5) { time=millis()-reset_time; seconds=time/1000.00; lcd.home(); lcd.print(seconds); delay(1); } //ждем перекрытия второго луча set2=analogRead(A1); delta2 = analogRead(A1)-set2; while (abs(delta2)<100) { delta2 = analogRead(A1)-set2; time=millis()-reset_time; seconds=time/1000.00; lcd.home(); lcd.print(seconds); delay(1);}}void loop() { }Не помню только, рабочая ли эта версия. Я всегда забываю у детей программки отбирать. Но в любом случае, они ее доделают с точки зрения эстетики (учителей информатики), усложнят для "пижонства" и на городских конференциях в следующем учебном году покажут/расскажут.Привезли организаторам соревнований за неделю, они протестировали.Простой, полезный проект. Месяц "угробили". Каждую коробочку печатать 3-4 часа, а в производство пошла 6 версия... Lego arduino программирование