На старт, внимание…таймер для гонок Grand Prix/Pinewood Derby , с помощью Netduino

Грэг Дункан

Сегодняшний аппаратный пятничный проект Coding4Fun воскрешает в памяти ряд воспоминаний. От собственного детства, сборки машин и гонок на Pinewood Derby(*), до родителя гонщика и споров, чья машина выиграла. Короче, я хотел бы представить…

Проект – Таймер для Grand Prix (Pinewood Derby) Timer

Поэтому позвольте мне ввести вас в курс дела (в случае, если вы не участвовали в соревнованиях Awana Grand Prix или Boy Scouts Pinewood Derby будучи ребенком). Вам 9 лет и вы, а также ваш папа (или мама) потратили пару выходных, собирая машину из сосновых брусков. Всё уже покрашено, оси и колеса отполированы и смазаны. Вы уверены, что ваша машина – самая быстрая. Настало время гонки. Автомобиль выходит на трек вместе с тремя соперниками. Пошел обратный отсчет … старт …гонка началась. Машины стартуют, спускаясь вниз по треку, в то время как родители столпились на финишной линии, ожидая кто же придет … но погодите!!! Сразу две машины финишируют одновременно. Теперь родители перематывают пленку в своих видеокамерах и следующие несколько минут «обсуждают» кто же действительно выиграл.

Есть ответ на этот вопрос, и он не подразумевает перемотки лент в видеокамерах (или, если хотите, быстрого повтора). Это таймер гонки. В продаже существуют доступные устройства, но смысл этих соревнований – провести время с детьми, поэтому почему бы не собрать его самим?

При нашей церкви был такой трек, но он был поврежден несколько лет тому назад настолько, что не имело смысла его восстанавливать. В прошлом году позаимствовали трек другой церкви, но таймер не работал как следует, потому что только показывал позиции (1-й, 2-й, 3-й и т. д. ) Поэтому после гонок наш руководитель гонок, Денни, поставил задачу построения своего трека, а я вызвался смастерить таймер.

На следующих страницах я опишу исследование, конструирование и постройку таймера, а также приведу связанные материалы. Также я планирую опубликовать все схемы, исходные коды и перечень использованных материалов, чтобы и другие могли им воспользоваться. Помните, что работа не завершена и находится в процессе выполнения. Я объявлю, когда перечень материалов и планы будут определены. Если у вас есть вопросы, пожалуйста, задавайте.

clip_image002

clip_image004

clip_image006

Проект – Таймер Grand Prix (Pinewood Derby), стр. 2 - конструирование

IR LED

clip_image008

Чтобы определить оптимальный способ подключения ИК-излучателей, я использовал Мастер светодиодов, расположенный здесь, и получил спецификации светодиодов и итоговую сумму. Он предложил пару вариантов и я решил остановиться на втором. Я запитываю их от 5 В и они соединяются последовательно с ограничивающим резистором (27 Ом 0,5 Вт). На макетной плате это работает прекрасно, и компоненты не нагреваются даже поле нескольких минут работы. Замечание: после окончательной сборки и работы в течение какого-то времени ограничительные резисторы стали довольно горячими. После анализа схемы я понял, что использовал резисторы мощностью 0,25 Вт, а не 0,5 Вт. Они будут заменены перед следующей гонкой из соображений безопасности.

Диаграммы работы и схемы

Эти диаграммы и схемы использованы для документирования конструкции таймера. Я сделал некоторые образцы и макеты, чтобы проверить, как это будет работать. Я применил такой же подход при написании кода и сборке. Однако после сборки таймера и написания кода я понял, что некоторые функции мне не нужны (вроде функции проверки статуса), или же мне понадобилось изменить конструкцию после начала сборки и поэтому документы не точно отражают состояние устройства и кода, использованного в модели. С учетом всего сказанного здесь, вы в состоянии разработать свой собственный таймер, но если возникнут проблемы, пожалуйста, дайте мне знать.

...

clip_image010

И фрагмент кода, 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 … и еще, где использовалась камера?… хм) clip_image012.

(*) Pinewood Derby – гонки самодельных машинок, собранных с участием родителей, популярные среди скаутов Северной Америки.