2014-12-20 5 views
0

임 Arduino와 C로 내 기술을 향상시키기위한 재미있는 프로젝트 (적어도 나를 위해) 작업. 8ch 릴레이 보드와 Arduino Uno를 사용하여 내 크리스마스 트리를 간단한 이퀄라이저로 바꿨습니다.쓰기 대신 Arduino 디지털 업데이트 핀?

내가 겪고있는 문제는 이미 디지털로 점등되어있는 핀에 HIGH로 쓸 때마다 스트로브 효과가 깜박입니다. 이 효과는 루프를보다 빠르고 정확하게 나타낼 수 있습니다. 나는 나의 문제가 나의 오래 끌린 코드라고 생각한다. 나는 항상 HIGH 또는 LOW를 모두 쓰는 것이 아니라 업데이트가 필요한 핀을 업데이트하는 것을 선호한다. 디지털 업데이트가 있습니까? 내 자신의 업데이트 기능에서 활용할 수있는 핀의 상태를 기억하거나 검사하는 기존 기능이 있습니까? 아니면 단순히 각 채널에 변수를 만들고 활용해야합니까?

int DO = 2; //Pin for Digital Output - DO 
int DA = A0; // Pin for Analog Output - AO 
int mult = 5; 
int threshold1 = 1 * mult; //Set minimum threshold for LED lit 
int threshold2 = 2 * mult; //Set minimum threshold for LED lit 
int threshold3 = 3 * mult; //Set minimum threshold for LED lit 
int threshold4 = 4 * mult; //Set minimum threshold for LED lit 
int threshold5 = 5 * mult; //Set minimum threshold for LED lit 
int threshold6 = 6 * mult; //Set minimum threshold for LED lit 
int threshold7 = 7 * mult; //Set minimum threshold for LED lit 
int threshold8 = 8 * mult; //Set minimum threshold for LED lit 
int threshold9 = 9 * mult; //Set minimum threshold for LED lit 
int sensorvalue = 0; 

//pinout 
int white1 = 3; 
int white2 = 4; 
int white3 = 5; 
int white4 = 6; 
int blue1 = 7; 
int blue2 = 8; 
int blue3 = 9; 
int red1 = 10; 

void loop() { 
    sensorvalue = ReadSens_and_Condition(); //Read the analog value 

    //Troubleshooting 
    //sensorvalue = 3; 
    Serial.print("Analog: "); 
    Serial.print(sensorvalue); //Print the analog value 
    Serial.print(" "); 
    Serial.print("Threshold: "); 
    Serial.print(threshold1); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold2); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold3); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold4); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold5); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold6); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold7); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold8); //Print the analog value 
    Serial.print(" "); 
    Serial.print(threshold9); //Print the analog value 
    Serial.print(" "); 
    Serial.print('\n'); 
    Serial.print('\n'); 

//mode 3 is best so far 
int mode = 3; 

int ReadSens_and_Condition(){ 
    int i; 
    int sval = 0; 

    for (i = 0; i < 50; i++){ 
    sval = sval + analogRead(DA); // sensor on analog pin 0 
    } 

    sval = sval/50; // average 
    sval = sval/4; // scale 
    return sval; 
} 

void setup() { 
    Serial.begin(9600); 
    pinMode(3, OUTPUT); 
    pinMode(4, OUTPUT); 
    pinMode(5, OUTPUT); 
    pinMode(6, OUTPUT); 
    pinMode(7, OUTPUT); 
    pinMode(8, OUTPUT); 
    pinMode(9, OUTPUT); 
    pinMode(10, OUTPUT); 

} 

//equalizer 
if(mode == 3){ 

    //delay 
    int pause = 5; 

    if(sensorvalue >= threshold9){ 
     digitalWrite(white3, HIGH); 
     digitalWrite(blue3, HIGH); 
     digitalWrite(white2, HIGH); 
     digitalWrite(blue2, HIGH); 
     digitalWrite(white1, HIGH); 
     digitalWrite(blue1, HIGH); 
     digitalWrite(white4, HIGH); 
     digitalWrite(red1, HIGH); 
     delay(pause); 
    } 

    else if(sensorvalue >= threshold8){ 
     digitalWrite(white3, HIGH); 
     digitalWrite(blue3, HIGH); 
     digitalWrite(white2, HIGH); 
     digitalWrite(blue2, HIGH); 
     digitalWrite(white1, HIGH); 
     digitalWrite(blue1, HIGH); 

     delay(pause); 

     digitalWrite(white4, LOW); 
     digitalWrite(red1, LOW); 

    } 

    else if(sensorvalue >= threshold6){ 
     digitalWrite(white2, HIGH); 
     digitalWrite(blue2, HIGH); 
     digitalWrite(white1, HIGH); 
     digitalWrite(blue1, HIGH); 

     delay(pause); 

     digitalWrite(white3, LOW); 
     digitalWrite(blue3, LOW); 
     digitalWrite(white4, LOW); 
     digitalWrite(red1, LOW); 
    } 

    else if(sensorvalue >= threshold4){ 
     digitalWrite(white1, HIGH); 
     digitalWrite(blue1, HIGH); 

     delay(pause); 

     digitalWrite(white2, LOW); 
     digitalWrite(blue2, LOW); 
     digitalWrite(white3, LOW); 
     digitalWrite(blue3, LOW); 
     digitalWrite(white4, LOW); 
     digitalWrite(red1, LOW); 

    } 



    else if(sensorvalue >= threshold2){ 
     digitalWrite(white1, LOW); 
     digitalWrite(white2, LOW); 
     digitalWrite(white3, LOW); 
     digitalWrite(white4, LOW); 
     digitalWrite(blue1, LOW); 
     digitalWrite(blue2, LOW); 
     digitalWrite(blue3, LOW); 
     digitalWrite(red1, LOW); 
     delay(pause); 

    } 

    else { 
     digitalWrite(white1, LOW); 
     digitalWrite(white2, LOW); 
     digitalWrite(white3, LOW); 
     digitalWrite(white4, LOW); 
     digitalWrite(blue1, LOW); 
     digitalWrite(blue2, LOW); 
     digitalWrite(blue3, LOW); 
     digitalWrite(red1, LOW); 
     delay(pause); 
    } 
} 


} 

답변

1

제가하는 데 문제는 때마다 나는 이미 스트로브 효과를 만들어 점멸합니다 불이 핀 디지털 쓰기 HIGH.

Atmel (또는 AFAIK 다른 모든) 마이크로 컨트롤러에는 해당되지 않습니다. 이미 높은 출력을 설정하면 글리치없이 높은 상태를 유지합니다. 또한, 출력을 설정하는 데 단지 몇 사이클이 걸리므로 글리치가 발생하면 오실로스코프가 없으면 표시되지 않습니다. 0.00001 초 동안 LED가 깜박 거리는 것을 감지하는 것은 너무 빠릅니다.

코드를로드 했으므로 (사소한 수정으로 일부 함수 정의를 루프 함수에 넣었습니다.) 다른 아무 것도 연결하지 않고 arduino에 입력하고 범위가 프로빙되면 모든 출력이 안정됩니다 (데이터가있는 직렬 출력 제외). 5V, GND 및 아날로그 입력 사이에 포트를 연결하면 각 출력이 켜지거나 꺼지게 할 수 있습니다. 그렇게하면 글리치 또는 스트로브가 발생하지 않습니다.

아날로그 신호에 노이즈의 결과가 표시되어 이것이 상태를 앞뒤로 바꿔 놓을 것으로 생각됩니다. 반복간에 값을 다듬어보십시오. 또한 출력 값을 설정하는 방법의 절반을 지연시킬 수 있습니다. 루프에 한 번 지연을 넣으면 타이밍이 혼란스럽지 않을 것입니다.

+0

이러한 구성 요소의 작동 방식에 대한 훌륭한 설명에 감사드립니다. 나는 Atmel이 출력이 높고 고장이 아니라는 것을 알았을 것이라고 생각했지만 여전히 스트로브를 계속 보았다. –

+0

나는 결국이 사실을 알아 냈습니다. 나는 실제로 포스트를 업데이트하기 위해 돌아오고 있었다. 당신이 올바른지. 그것은 아날로그 신호의 잡음이었습니다. 나는 타이밍과 딜레이를 조금씩했는데 모두 잘했다. 특별한 것은 없지만 나에게 재미있는 학습 경험 : http://youtu.be/jkI-5WdBZIM?list=UUFUY0-QPkLLdw_7Vr6ERNFQ –

+0

호기심에서, 내 ReadSens_and_Condition() 함수의 for 문이 얼마나 빠르는지 아십니까? 달릴 필요가 있니? 그것이 없으면 분명히 0이 아니었을지라도 0 값을 많이 읽었습니다. 샘플 수를 늘리면 기능이 느려지는 것 같습니다. 그럴까요? –

관련 문제