Arduino

HeliOS para Arduino

HeliOS para Arduino
Os microcontroladores de um Arduino usam um único programa para controlar todos os interruptores, LEDs e outras partes do sistema. O primeiro programa aprendido por um usuário do Arduino é normalmente o programa 'Blink', que usa a função de atraso para ligar e desligar um LED em um padrão uniforme. Este programa simples pode ser estendido para fazer muitas coisas, mas não pode incluir multitarefa.

Para projetos mais avançados, você precisa alterar os valores e ler os dados em tempo real, o que não é possível com a função de atraso padrão no Arduino. Portanto, uma solução diferente é necessária. Felizmente, HeliOS pode ajudar.

As limitações do Arduino

Conforme mencionado na introdução, a linguagem padrão de um Arduino pode ser aplicada de várias maneiras. No entanto, há um problema: o Arduino não pode realizar multitarefa. Por exemplo, você não pode definir três LEDs diferentes para piscar em intervalos independentes. Esta tarefa não pode ser realizada porque, se você usar o retardo, o LED com o maior retardo bloqueará o piscar dos outros LEDs enquanto espera para alternar os estados.

A votação padrão também é problemática, pois verificar o estado de um botão requer que uma ação seja executada. Em um Arduino padrão, você deve configurar uma função para pesquisar o estado de um switch ou qualquer outro estado.

Embora existam soluções para resolver esses problemas (e.g., interrupções de hardware, a função millis, a implementação do FreeRTOS), mas essas soluções também têm limitações. Para superar os problemas dessas soluções, Mannie Peterson inventou HeliOS. HeliOS é pequeno e eficiente, e pode até ser executado em controladores de 8 bits.

Considere o código abaixo, que não é confiável na melhor das hipóteses porque a instrução de atraso impedirá que o botão seja verificado.

botãoPin int = 2; // o número do pino do botão
int ledPin = 4; // o número do pino LED
// as variáveis ​​mudarão:
int buttonState = 0; // variável para ler o status do botão de pressão
void setup ()
// inicializa o pino do LED como uma saída:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// inicializa o pino do botão de pressão como uma entrada:
pinMode (buttonPin, INPUT);

void loop ()
// leia o estado do valor do botão:
buttonState = digitalRead (buttonPin);
// verifique se o botão está pressionado. Se for, o buttonState é HIGH:
if (buttonState == HIGH)
digitalWrite (ledPin, HIGH); // liga o LED
senão
digitalWrite (ledPin, LOW); // desliga o LED

digitalWrite (LED_BUILTIN, HIGH); // liga o LED (HIGH é o nível de tensão)
atraso (1000); // espere um segundo
digitalWrite (LED_BUILTIN, LOW); // desligue o LED tornando a tensão BAIXA
atraso (1000); // espere um segundo

Ao executar este código, você verá que o 'ledPin' piscará normalmente. No entanto, quando você pressiona o botão, ele não acende ou, se acender, atrasa a sequência de piscadas. Para fazer este programa funcionar, você pode alternar para outros métodos de atraso; no entanto, HeliOS oferece uma alternativa.

Linux incorporado no Arduino (HeliOS)

Apesar do “SO” em seu nome, HeliOS não é um sistema operacional: é uma biblioteca de funções multitarefa. No entanto, ele implementa 21 chamadas de função que podem simplificar tarefas de controle complexas. Para tarefas em tempo real, o sistema deve lidar com as informações externas à medida que são recebidas. Para fazer isso, o sistema deve ser capaz de multitarefa.

Várias estratégias podem ser usadas para lidar com tarefas em tempo real: estratégias orientadas a eventos, estratégias balanceadas em tempo de execução e estratégias de notificação de tarefas. Com HeliOS, você pode empregar qualquer uma dessas estratégias com chamadas de função.

Como o FreeRTOS, o HeliOS aprimora os recursos de multitarefa dos controladores. No entanto, os desenvolvedores que estão planejando um projeto complexo de importância crítica precisam usar o FreeRTOS ou algo semelhante, porque o HeliOS se destina ao uso por entusiastas e hobistas que desejam explorar o poder da multitarefa.

Instalando HeliOS

Ao usar as bibliotecas do Arduino, novas bibliotecas podem ser instaladas com o IDE. Para as versões 1.3.5 e acima, você escolhe usar o Gerenciador de Biblioteca.


Como alternativa, você pode baixar um arquivo zip da página da web e usar esse arquivo para instalar o HeliOS.


Observe que você precisa incluir HeliOS em seu código antes de começar a usá-lo.

Exemplo

O código abaixo pode ser usado para fazer um LED piscar uma vez por segundo. Embora tenhamos adicionado o código HeliOS, o efeito final é o mesmo do tutorial introdutório.

A principal diferença aqui é que você deve criar uma tarefa. Esta tarefa é colocada em um estado de espera e um cronômetro é definido para dizer à tarefa quando ela deve ser executada. Além disso, o loop contém apenas uma instrução: xHeliOSLoop (). Este loop executa todo o código definido na configuração () do código. Ao planejar seu código, você precisa definir todos os pinos, constantes e funções na configuração superior.

#incluir
// Usado para armazenar o estado do LED
volátil int ledState = 0;
volátil int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Definir uma tarefa de piscar
void taskBlink (xTaskId id_)
if (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
senão
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;



// Definir uma tarefa de leitura de botão
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// verifique se o botão está pressionado. Se for, o buttonState é HIGH:
if (buttonState == HIGH)
// liga o LED:
digitalWrite (ledPin, HIGH);
senão
// desligue o LED:
digitalWrite (ledPin, LOW);


void setup ()
// id mantém o controle das tarefas
xTaskId id = 0;
// Isso inicializa as estruturas de dados Helios
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// inicializa o pino do botão de pressão como uma entrada:
pinMode (buttonPin, INPUT);
// Adicione e faça o taskBlink esperar
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Intervalo do cronômetro para 'id'
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("BUTTON", & buttonRead);
xTaskStart (id);

void loop ()
// Isso, e apenas isso, está sempre em loop ao usar Helios
xHeliosLoop ();

Com este código, você pode programar o LED para piscar a qualquer momento sem ter que se preocupar com o atraso do Arduino.

Conclusão

Este projeto é ótimo para pessoas que são novas no Arduino, pois permite que você use o código regular do Arduino para lidar com tarefas em tempo real. No entanto, o método descrito neste artigo é apenas para amadores e pesquisadores. Para projetos mais sérios, outros métodos são necessários.

Como capturar e transmitir sua sessão de jogo no Linux
No passado, jogar era considerado apenas um hobby, mas com o tempo a indústria de jogos viu um grande crescimento em termos de tecnologia e número de ...
Melhores jogos para jogar com rastreamento manual
Oculus Quest introduziu recentemente a grande ideia de rastreamento manual sem controladores. Com um número cada vez maior de jogos e atividades que e...
Como mostrar a sobreposição de OSD em aplicativos e jogos Linux em tela cheia
Jogar jogos em tela cheia ou usar aplicativos em modo de tela cheia sem distração pode cortar você das informações relevantes do sistema visíveis em u...