На старт, внимание…таймер для гонок Grand Prix/Pinewood Derby , с помощью Netduino
Сегодняшний аппаратный пятничный проект Coding4Fun воскрешает в памяти ряд воспоминаний. От собственного детства, сборки машин и гонок на Pinewood Derby(*), до родителя гонщика и споров, чья машина выиграла. Короче, я хотел бы представить…
Проект – Таймер для Grand Prix (Pinewood Derby) Timer
Поэтому позвольте мне ввести вас в курс дела (в случае, если вы не участвовали в соревнованиях Awana Grand Prix или Boy Scouts Pinewood Derby будучи ребенком). Вам 9 лет и вы, а также ваш папа (или мама) потратили пару выходных, собирая машину из сосновых брусков. Всё уже покрашено, оси и колеса отполированы и смазаны. Вы уверены, что ваша машина – самая быстрая. Настало время гонки. Автомобиль выходит на трек вместе с тремя соперниками. Пошел обратный отсчет … старт …гонка началась. Машины стартуют, спускаясь вниз по треку, в то время как родители столпились на финишной линии, ожидая кто же придет … но погодите!!! Сразу две машины финишируют одновременно. Теперь родители перематывают пленку в своих видеокамерах и следующие несколько минут «обсуждают» кто же действительно выиграл.
Есть ответ на этот вопрос, и он не подразумевает перемотки лент в видеокамерах (или, если хотите, быстрого повтора). Это таймер гонки. В продаже существуют доступные устройства, но смысл этих соревнований – провести время с детьми, поэтому почему бы не собрать его самим?
При нашей церкви был такой трек, но он был поврежден несколько лет тому назад настолько, что не имело смысла его восстанавливать. В прошлом году позаимствовали трек другой церкви, но таймер не работал как следует, потому что только показывал позиции (1-й, 2-й, 3-й и т. д. ) Поэтому после гонок наш руководитель гонок, Денни, поставил задачу построения своего трека, а я вызвался смастерить таймер.
На следующих страницах я опишу исследование, конструирование и постройку таймера, а также приведу связанные материалы. Также я планирую опубликовать все схемы, исходные коды и перечень использованных материалов, чтобы и другие могли им воспользоваться. Помните, что работа не завершена и находится в процессе выполнения. Я объявлю, когда перечень материалов и планы будут определены. Если у вас есть вопросы, пожалуйста, задавайте.
Проект – Таймер Grand Prix (Pinewood Derby), стр. 2 - конструирование
IR LED
Чтобы определить оптимальный способ подключения ИК-излучателей, я использовал Мастер светодиодов, расположенный здесь, и получил спецификации светодиодов и итоговую сумму. Он предложил пару вариантов и я решил остановиться на втором. Я запитываю их от 5 В и они соединяются последовательно с ограничивающим резистором (27 Ом 0,5 Вт). На макетной плате это работает прекрасно, и компоненты не нагреваются даже поле нескольких минут работы. Замечание: после окончательной сборки и работы в течение какого-то времени ограничительные резисторы стали довольно горячими. После анализа схемы я понял, что использовал резисторы мощностью 0,25 Вт, а не 0,5 Вт. Они будут заменены перед следующей гонкой из соображений безопасности.
Диаграммы работы и схемы
Эти диаграммы и схемы использованы для документирования конструкции таймера. Я сделал некоторые образцы и макеты, чтобы проверить, как это будет работать. Я применил такой же подход при написании кода и сборке. Однако после сборки таймера и написания кода я понял, что некоторые функции мне не нужны (вроде функции проверки статуса), или же мне понадобилось изменить конструкцию после начала сборки и поэтому документы не точно отражают состояние устройства и кода, использованного в модели. С учетом всего сказанного здесь, вы в состоянии разработать свой собственный таймер, но если возникнут проблемы, пожалуйста, дайте мне знать.
...
И фрагмент кода, https://gprt.codeplex.com
public static void Main()
{
// which lanes will be used during the race, default to all in use
Lane_1_Enabled = true;
Lane_2_Enabled = true;
Lane_3_Enabled = true;
Lane_4_Enabled = true;
Lane_5_Enabled = true;
Lane_6_Enabled = true;
Lane_7_Enabled = true;
Lane_8_Enabled = true;
for (int i = 1; i <= timerResolution; i++)
{
timerRes = timerRes + "9";
}
//setup the LCD
LCD.Clear();
LCD.SetCursor(0, 0);
LCD.BacklightBrightness = 40;
//create interrupt event handlers one for each GPIO setup.
Lane_1.OnInterrupt += new NativeEventHandler(Lane_1_OnInterrupt);
Lane_2.OnInterrupt += new NativeEventHandler(Lane_2_OnInterrupt);
Lane_3.OnInterrupt += new NativeEventHandler(Lane_3_OnInterrupt);
Lane_4.OnInterrupt += new NativeEventHandler(Lane_4_OnInterrupt);
Lane_5.OnInterrupt += new NativeEventHandler(Lane_5_OnInterrupt);
Lane_6.OnInterrupt += new NativeEventHandler(Lane_6_OnInterrupt);
Lane_7.OnInterrupt += new NativeEventHandler(Lane_7_OnInterrupt);
Lane_8.OnInterrupt += new NativeEventHandler(Lane_8_OnInterrupt);
StartGate.OnInterrupt += new NativeEventHandler(StartGate_OnInterrupt);
//write out startup text
LCD.Clear();
LCD.WriteText("Grand Prix Tim" +
"er v0.1 By: " +
"JarrodSinclair" +
"Hold Button 4 " +
"for Status " +
"Check ");
Thread.Sleep(1500);
if (Button.Read() == false)
{
//button is being pressed during boot... call StatusCheck
LCD.Clear();
LCD.WriteText("STATUS CHECK: " +
"Be sure Start " +
"Gate is closed" +
" " +
"Hold Button " +
"to continue. ");
// let the user read the message
Thread.Sleep(1000);
while (Button.Read())
{
// waiting for use to press button
Thread.Sleep(250);
}
StartStatusCheck();
}
LCD.Clear();
LCD.WriteText("Grand Prix Tim" +
"er v0.1 By: " +
"JarrodSinclair" +
"@Hotmail.com " +
" " +
"READY TO RACE ");
COM1.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataRecieved);
COM1.Open();
//prepare the timer and lanes for a race
Reset();
// ....
}
}
Вы скажете излишество? Единственным излишеством было бы, если результаты выкладывались в твиттер и делался бы снимок … ( хм…не рассказывал ли я, как организовать публикацию в Twitter из Netduino … и еще, где использовалась камера?… хм) .
(*) Pinewood Derby – гонки самодельных машинок, собранных с участием родителей, популярные среди скаутов Северной Америки.