Amigas e amigos,
Fiz um programa (Arduino IDE) para gerar uma senoide de luz o mais perfeita possivel. Usei um arduino e uma anel de 35 leds neopixel. Isto foi em fevereiro deste ano. Deixo o programa em anexo.
Conferi o resultado fazendo um vídeo, onde o anel ilumina um plano branco. Processando a imagem (phyton opencv), o resultado é uma linda senoide, quase perfeita e com todos os ciclos iguais.
Porém, ontem, usando o mesmo programa no arduino IDE, a senoide está distorcida, e o primeiro ciclo aparece com mais intensidade que as outras, além de um ruído.
Troquei o anel, a placa arduino, os cabos, com fonte, sem fonte, versões antigas do programa (que também funcionavam), pinos de controle (10,8,3 etc), analisei as imagens com outros programas (matlab) e deu o mesmo resultado, a senoide distorcida.
Só restou a possibilidade de alguma biblioteca da adafruit ou do arduino. Ainda não achei nada, alguém teria algum palpite. Obrigado.
// LIGHT SIN by Caprario
#include //biblioteca do anel
#include
#define NUMLED 35 //número de leds do anel
#define PIN 10 // pino controle do anel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMLED, PIN, NEO_GRB + NEO_KHZ800); // seta o anel
#define brilhopad 50
byte brilhot[510];
byte bmax = 255;
byte bmin = 20;
byte delta = (bmax - bmin);
int id = int(delta) * 2;
//double periodo[] = { 8000, 4000, 3000, 2000, 1000, 750, 500 };
double periodo[] = { 2000, 2000, 750 }; // digitar apenas o cliclo a ser ensaiado
float intervalo;
float a;
int NCICLOS = 10;
byte corR, corG, corB;
void setup() {
Serial.begin(9600);
strip.begin();
clearring();
}
void loop() {
int lote = sizeof(periodo) / sizeof(double); // quantidade de periodos slecionados
float tempo = 0;
corR = brilhopad;
corG = brilhopad;
corB = brilhopad;
for (int k = 0; k < (lote); k++) {
Serial.println("clique enter para começar");
while (!Serial.available()) {
// Aguarde até que haja dados disponíveis no buffer serial
}
// Limpe o buffer serial - se não fizer não rearma
while (Serial.available()) {
Serial.read();
}
Serial.print("**************** VAI COMEÇAR **************** ");
Serial.println(periodo[k]);
delay(2000); // corrida para preparar o ensaio, ligar a camêra etc.
intervalo = periodo[k] / (2 * float(delta)); // em milisegundos
for (int i = 0; i < id; i++) {
a = float(delta / 2);
a = a * (sin((2 * PI * intervalo * float(i) / periodo[k]) + 1.5 * PI) + 1);
a = a + bmin;
brilhot[i] = byte(a);
}
intervalo = intervalo * 1000; // em microsegundos
clearring();
delay(500);
tempo = micros();
for (int l = 0; l < NCICLOS; l++) {
for (int j = 0; j < id; j++) {
strip.setBrightness(brilhot[j]);
tempo = tempo + intervalo;
while (micros() < tempo) {
for (int i = 0; i < NUMLED; i++) {
strip.setPixelColor(i, strip.Color(corR, corG, corB));
}
strip.show();
}
}
}
clearring(); //apaga o anel
}
Serial.println("c'est fini ");
delay(100);
}
void clearring() { //esta opção apaga o anel
for (int i = 0; i < NUMLED; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}