Ѕиблиотека ускор€юща€ работу платы Arduino

11.08.2019, 10:40


’очу поделитс€ с читател€ми, библиотекой ЂCyberLibї, значительно ускор€ющую работу ардуино.
Ѕиблиотека работает с Arduino Nano, Arduino Mega и Arduino Leonardo.

ѕерейду сразу к описанию.

–абота с цифровыми портами

ќписание

—тандартный скетч Blink без delay():

void setup()
{
   pinMode(13, OUTPUT);
}

void loop()
{
   digitalWrite(13, HIGH);
   digitalWrite(13, LOW);
}  

«анимает 874 байта и выдаЄт на пин 13 частоту 120 к√ц.

— библиотекой ЂCyberLibї

#include "CyberLib.h"
void setup()
{
   D13_Out; 
}

void loop()
{
   D13_High;
   D13_Low;
}  

«анимает 566 байт и выдаЄт частоту 2650 к√ц.
–азогналась в 22 раза.

”правление пинами:
Dx_Out; Ч установка пина ’ как выход
Dx_In; Ч установка пина ’ как вход
Dx_Hihg; Ч установка высокого уровна на пине ’
Dx_Low; Ч установка низкого уровн€ на пине ’
Dx_Read; Ч чтение пина ’
Dx_Inv; Ч инвертирует значение на пине ’

„тение аналогового входа

ќписание

—тандартный скетч:

unsigned long   timme;

void setup()
{
   Serial.begin(57600);
}

void loop()
{
   timme = micros(); 
   float i = analogRead(0);
   timme = micros()-timme;
   Serial.println(timme);
   delay(1000);
} 

—корость чтени€ 112 мкс.

— ЂCyberLibї

#include <CyberLib.h>
unsigned long   timme;
void setup()
{
   Serial.begin(57600);
}

void loop()
{
   timme = micros(); 
   float i = A0_Read;
   timme = micros()-timme;
   Serial.println(timme);
   delay(1000);
} 

—корость чтени€ 68 мкс. ¬ два раза быстрее.

”правление пинами:
Ax_Read; Ч чтение аналогового пина ’

„тение и запись Serial

ќписание

—тандартный скетч:

byte b=255;

void setup() 
 {
    Serial.begin(57600);
 }

void loop() 
 { 
    Serial.write(b);
 } 

—кетч зан€л 1650 байт.

— ЂCyberLibї

#include <CyberLib.h>
byte b=255;

void setup() 
 {
    UART_Init(57600);
 }

void loop() 
 { 
 
  if(UART_ReadByte(b)) 
   { 
      UART_SendByte(b);
   }
 }

ѕолучилось 800 байт. ¬ два раза меньше.

UART_Init(57600); Ч инициализаци€ последовательного порта.
UART_ReadByte(b); Ч получить байт данных из последовательного порта.
UART_SendByte(b); Ч отправить байт данных в последовательный порт.
Ѕуфферизируетс€ только 1 байт данных, прин€тый с Serial порта.

ќтправка массива в Serial

ќписание

#include <CyberLib.h>  
uint8_t message[] = "geek"; 

void setup()  
 {   
    UART_Init(115200);
 }  
void loop()  
 {  
    UART_SendArray( message, 4); 
 } 

UART_SendArray(array, size array); Ч отправл€ет в порт массив типа байт. √де array-им€ вашего массива, а size array-число отправл€емых байт массива.
ћаксимальный объем массива не должен превышать 65535 байт.

јльтернатива стандартным функци€м delayMicroseconds() и delay()

ќписание

‘ункции delay_us(); и delay_ms(); можно примен€ть в прерывани€х так как они не используют таймер. “очность этих функций зависит от использовани€ в коде обработчиков прерываний. ≈сли в коде не использовать прерывани€ точность будет высока€.
delay_us(n); n Ч задержка в мкс, максимальна€ задержка может быть не больше 16000 мкс.
delay_ms(n); n Ч задержка в мс, максимальна€ задержка может быть не больше 65000 мс.

–абота с Timer1

ќписание

#include <CyberLib.h> 
void setup() 
{  
   D13_Out; 
   StartTimer1(obrobotchik, 1000000);  
} 

void obrobotchik() 
{ 
  D13_High; 
  delay_ms(100);
} 

void loop()
{
  D13_Low;
} 

StartTimer1(obrobotchik, 1000); ѕервый параметр-обработчик прерывани€, будет запускатьс€ каждый раз по истечении заданного времени. ¬торой параметр это врем€, может принимать значени€ от 6 до 4000000 мкс., шаг 1 мкс.
StopTimer1(); Ч остановить таймер.
ResumeTimer1(); Ч возобновить отсчет после остановки.
RestartTimer1(); Ч перезапустить отсчет таймера заново.

–абота с SPI

ќписание

#include <CyberLib.h> 
void setup() 
{  
   StartSPI(0, 8, 1); // MODE0, DIV8, MSBFIRST инициализаци€ SPI  
} 
void loop() 
{ 
  SendSPI(170); //отправить один байт в шину SPI
}

”величена пропускна€ спсобность 1.85 раза.
StartSPI(0, 2, 1); Ч ѕервый параметр это режим mode от 0 до 3.
¬торой Ч это делитель тактовой частоты, может принимать значени€ 2, 4, 8, 16, 32, 64, 128. ƒл€ вычислени€ частоты SPI нужно тактовую частоту контроллера 16000000 разделить на любой делитель из списка.
“ретий параметр это какой бит пойдет первым. ≈сли 1 то первым пойдет старший бит если 0 то первым пойдет младший бит.
ќтправить байт: SendSPI(b);
ѕолучить байт: MyData=ReadSPI();
¬ыключить SPI: StopSPI();

–абота с EEPROM

ќписание

WriteEEPROM_Long(0, 4000000); Ч записать 4000000 в EEPROM по адресу 0 тип Long.
uint32_t tmp=ReadEEPROM_Long(0); Ч прочитать из EEPROM с адреса 0 значение типа Long.

WriteEEPROM_Word(0, 4000); Ч записать 4000 в EEPROM по адресу 0 тип Word.
uint16_t tmp=ReadEEPROM_Word(0); Ч прочитать из EEPROM с адреса 0 значение типа Word.
WriteEEPROM_Byte(0, 40); Ч записать 40 в EEPROM по адресу 0 тип Byte.
uint8_t tmp=ReadEEPROM_Byte(0); Ч прочитать из EEPROM с адреса 0 значение типа Byte.

јдресует максимум 256 адресов дл€ типа Byte
ƒл€ Word максимум 128
ƒл€ Long максимум 64

—торожевой таймер

ќписание

reset(); Ч программный сброс контроллера.
ѕри помощи этой функции можно отправить контроллер в ребут в любом месте выполн€емой программы.

wdt_reset(); Ч обнулить сторожевой таймер.
wdt_disable(); Ч выключить сторожевой таймер.
wdt_enable(timeout); Ч инициализаци€ сторожевого таймера.
¬озможные значени€ timeout
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S

Ѕудте внимательны, не все ардуины корректно работают со сторожевым таймером (надо перешивать загрузчик), можно окирпичить контроллер.

Ѕесконечный цикл

ќписание

#include <CyberLib.h> 
void setup() 
{  
   // что-то
} 
void loop() 
{ 
  Start
  // что-то выполн€етс€
  End
}

Start Ч Ќачало цикла
End Ч  онец цикла
÷икл выполн€етс€ внутри конструкции Start-End.

‘ильтр дл€ удалени€ шума или ложных срабатываний

ќписание

#include <CyberLib.h>
uint16_t sensor[]={10, 15, 55, 999, 10, 8, 9, 11, 700, 455, 123, 999, 543, 567, 65535, 43555, 999, 10, 43, 99, 66, 987, 999, 100};
void setup() 
{
  Serial.begin(115200);
  uint16_t cm = find_similar(sensor, sizeof(sensor)/2, 0);
  Serial.println(cm, DEC);
}
 void loop() {}  

ѕриведенный пример показывает наиболее часто встречаемое значение 999, но если изменить третий параметр вызываемой функции с 0 на 1, то функци€ вернет значение 10, так как посчитает значение 9 и 11 как 10

find_similar(Array, sizeArray, range);
Array Ч ”казатель на провер€емый массив, массив может иметь тип uint16_t или uint8_t.
sizeArray Ч длинна массива не более 256 элементов.
range Ч предел погрешности(отклонение) может колебатьс€ от 0 до 127, при значении 0 функци€ будет искать точные копии значений.
Ќапример: ”льтразвуковой дальномер производит 5 замеров и складывает эти показани€ в массив, после выполнени€ этой функции будет возвращено наиболее веро€тное измер€емое значение.

Ѕиблиотека написана не мной, € лишь опубликовал еЄ с разрешени€ автора.
«десь находитс€ источник, автор либы Admin.
ј тутили тут можно скачать сабж.

јвтор: starikstd


 лючевые слова:
библиотеки ардуино
ардуино
программма
nano
MEGA
цифровые порты
CyberLib
UART
include
Serial
EEPROM
параметр
массив
–абота
таймер
Arduino
micros
задержка
–оботы на платформе јрдуино
робот
робототехника


¬ернутьс€ в рубрику:

ѕроекты на платформе јрдуино


≈сли вы хотите видеть на нашем сайте больше статей то кликните ѕоделитьс€ в социальных сет€х! —пасибо!
—мотрите также:

ќбратите внимание полезна€ информаци€.