"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

среда, 27 января 2021 г.

КРУЖОК ОТ 29.01.21

Программа, которая была представлена 25.01.21 естественно не заработала. Ниже представлен программный код этой программы.

void setup() {
  DDRB = 0xff;
  DDRD = 0xff;
}
int counter0 = 0;
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
int counter4 = 0;
int counter5 = 0;
int counter6 = 0;

void loop() {
  counter1++;
  if (counter1 == 100)
  {
    counter1 = 0;
    counter2++;
  }
  if (counter2 == 10)
  {
    counter2 = 0;
    counter3++;
  }
  if (counter3 == 6)
  {
    counter3 = 0;
    counter4++;
  }
  if (counter4 == 10)
  {
    counter4 = 0;
    counter5++;
  }
  if (counter5 == 6)
  {
    counter1 = 0;
    counter2 = 0;
    counter2 = 0;
    counter3 = 0;
    counter4 = 0;
  }
  switch(counter6){
    case 1:
    PORTD = 0b00001000;
    counter0 = counter2;
    case 2:
    PORTD = 0b00010000;
    counter0 = counter3;
    case 3:
    PORTD = 0b00010000;
    counter0 = counter4;
    case 4:
    PORTD = 0b00100000;
    counter0 = counter5;
    }
  switch(counter0){
    case 0:
    PORTD &=~( 1<<7);
    PORTB = 0b00001000;
    case 1:
    PORTD &=~( 1<<7);
    PORTB = 0b11011111;
    case 2:
    PORTD |= 1<<7;
    PORTB = 0b11001000;
    case 3:
    PORTD &=~( 1<<7);
    PORTB = 0b11001001;
    case 4:
    PORTD &=~( 1<<7);
    PORTB = 0b11010011;
    case 5:
    PORTD &=~( 1<<7);
    PORTB = 0b11100100;
    case 6:
    PORTD &=~( 1<<7);
    PORTB = 0b11100000;
    case 7:
    PORTD &=~( 1<<7);
    PORTB = 0b11001111;
    case 8:
    PORTD &=~( 1<<7);
    PORTB = 0b11000100;
    case 9:
    PORTD &=~( 1<<7);
    PORTB = 0b11000010;
    }
}

Проанализируем данную программу графически. Тоесть нарисуем схему алгоритма этой программы. Результат показан ниже.

На схеме алгоритма сразу видно, две логические ошибки, которые выделены красным. Коректировку  алгоритма тоже довольно легко выполнить, когда перед глазами схема. А корректуру в наш алгоритм все равно вносить придется, так как мы будем усложнять нашу схему секундомера - добавим кнопку которая будет его запускать и останавливать, без сброса времени.


Здесь сразу стоит отметить, что кнопка требует описания на языке программирования, так же требуется настроить пин к которму подключена кнопка на вход. Если мы используем штатные команды то это будет выглядеть примерно так:

 void setup()
{
  pinMode(1, INPUT);
}

void loop()
{
  digitalRead(1);
  delay(10); // Delay a little bit to improve simulation performance
}

Недостатком такого подхода заключается во времени обработки такого кода и его размере. Альтернативой обработки кнопки будет следущая конструкция:

void setup()
{
  DDRD = 0b11111101; //настройка пина 1 на вход и  пинов 0,2,3,4,5,6,7 на выход
}

void loop()
{
  // 38. Цикл Вопрос / кнопка нажата? == Да
if (PIND & (1 << PORTD1)) ...; //за условием помещается команда выполняемая при нажатии кнопки
}

Кстати отсутствие комментариев в тексте программы - дурной тон в программировании

Итак задача на этом уроке следующая - Поправить текст программы ипроверить ее рабоспособность. Далее усложнить предложенную схему кнопкой управления и откорректировать программу.

воскресенье, 24 января 2021 г.

КРУЖОК ОТ 25.01.21

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

Монтажная схема представлена ниже.


А вот схему алгоритма ... нарисуете самостоятельно, так как без нее дальше не обойтись




 

воскресенье, 17 января 2021 г.

КРУЖОК ОТ 14.01.21


И да, мы собрали, запустили цифровое табло из двух сегментов. Заработало. Но есть нюансы. Макет сборки представлен ниже.


Как собрать цифровое табло из четырех сегментов? Как их подключить?  Как подключить к одной плате микроконтроллера 32 контакта четырех сегментов? Можно конечно расширить количество портов, а можно все сегменты подключить паралельно, а питающий провод подключить для каждого сегмента на отдельный пин. Так как мощность сементов не велика то их можно подключать без полупроводниковой развязки. Учитывая инертность светодиода и высокую частоту работы микроконтроллера, то можно последовательно обращаться к сегментам индицирую различные цифры. Примерная схема ниже.







Осталось только придумать алгоритм для индикации на четырех сегментах минут и секунд. Жду ваших предложений. Программу напишим на кружке.