Help me, plz!

Тема в разделе "Посоветуйте детальки", создана пользователем Aziza, 21 фев 2014.

  1. Unixon

    Unixon Оракул Модератор

    Если не использовать специальных сенсоров, тогда как-то так.
     
  2. Aziza

    Aziza Нерд

    спасибо!
    Но опять таки я не смогу сделать именно чтоб реагировал на трение, что лампу будут тереть, а не дотрагиваться до нее?)
     
  3. acos

    acos Официальный гик Администратор

    А если поставить два датчика рядом, и смотреть, что включается то один то второй? (именно такое поведение будет, если его тереть)
     
  4. Aziza

    Aziza Нерд

    Спасибо за помощь. Но сейчас у нас очень мало времени и мы не справляемся.
    Поэтому мы хотим использовать вот этот код для нашей лампы.
    http://blog.simtronyx.de/en/mood-la...lass-and-a-few-parts-from-the-hardware-store/

    Но для вкл/выкл использовать датчик прикосновения с 4 лапками, то есть чтоб вкл/выкл нужно дотронуться до 4 сенсоров.

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

    acos Официальный гик Администратор

  6. Aziza

    Aziza Нерд

    как мы поняли, это должно быть так? Только не понятно, почему там два выхода в 5в, и куда выходят 4,5,6 нога? нужны ли вспомогательные материалы, в виде транз или резизт?
     

    Вложения:

  7. acos

    acos Официальный гик Администратор

    Это не 2 выхода 5 В, это просто обозначение, что эти выводы надо подключать к 5 вольтам. Так принято)
    Схема правильная. Правда можно 10-й вывод к 5 вольтам не подключать. Но можно и подключить)
    Можно обойтись без транзисторов. Резисторы должны быть на 220 Ом так, как я вам рисовал.
    4,5,6 нога где? на этой схеме? На этой схеме все входы (1-7) ULN2003 должны идти на ардуино. Правда тут другая версия ULN2003 - ULN2803. Она отличается тем, что у неё 8 входов, а у ULN2003 - 7 входов.
     
  8. Aziza

    Aziza Нерд

    Вот такая у нас получилась схема. Правильно ли это?
    если, да, то как дальше подключить датчик?
     

    Вложения:

  9. Aziza

    Aziza Нерд

    Код (Text):
    unsigned char Prescaler = 0;
    #define PrescalerOverflowValue 4
    ISR(TIMER2_OVF_vect)
    {
      if (Prescaler < PrescalerOverflowValue)
        Prescaler++;
      else {
        Prescaler = 0;
        Multiplex();
      }
    }


    unsigned char CurrentLED = 1;
    unsigned char LEDValues[8][3];
    bool LEDMoveDir[8][3];
    void Multiplex(void)
    {  
      PORTD &= 0b00000011; // Control pin 0-5
      PORTB &= 0b11101110; // Control pin 6-7
     
      analogWrite(9, 255-LEDValues[CurrentLED][0]);
      analogWrite(10, 255-LEDValues[CurrentLED][1]);
      analogWrite(11, 255-LEDValues[CurrentLED][2]);
     
      switch (CurrentLED)
      {
        case 0:
          //digitalWrite(2, 1); // Turn on LED 1
          PORTD |= 0b00000100;      
          break;
        case 1:
          //digitalWrite(3, 1); // Turn on LED 1
          PORTD |= 0b00001000;            
          break;
        case 2:
          //digitalWrite(4, 1); // Turn on LED 1
          PORTD |= 0b00010000;            
          break;
        case 3:
          //digitalWrite(5, 1); // Turn on LED 1
          PORTD |= 0b00100000;                  
          break;
        case 4:
          //digitalWrite(6, 1); // Turn on LED 1
          PORTD |= 0b01000000;      
          break;
        case 5:
          //digitalWrite(7, 1); // Turn on LED 1
          PORTD |= 0b10000000;            
          break;
        case 6:
          //digitalWrite(8, 1); // Turn on LED 1
          PORTB |= 0b00000001;            
          break;
        case 7:
          //digitalWrite(12, 1); // Turn on LED 1
          PORTB |= 0b00010000;                  
          break;    
      }  

      CurrentLED++;
      if (CurrentLED > 7)
        CurrentLED = 0;
    }

    void setPwmFrequency(int pin, int divisor) {
      byte mode;
      if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
        switch(divisor) {
          case 1: mode = 0x01; break;
          case 8: mode = 0x02; break;
          case 64: mode = 0x03; break;
          case 256: mode = 0x04; break;
          case 1024: mode = 0x05; break;
          default: return;
        }
        if(pin == 5 || pin == 6) {
          TCCR0B = TCCR0B & 0b11111000 | mode;
        } else {
          TCCR1B = TCCR1B & 0b11111000 | mode;
        }
      } else if(pin == 3 || pin == 11) {
        switch(divisor) {
          case 1: mode = 0x01; break;
          case 8: mode = 0x02; break;
          case 32: mode = 0x03; break;
          case 64: mode = 0x04; break;
          case 128: mode = 0x05; break;
          case 256: mode = 0x06; break;
          case 1024: mode = 0x7; break;
          default: return;
        }
        TCCR2B = TCCR2B & 0b11111000 | mode;
      }
    }

    int Red, Green, Blue;
    int Hue1, Hue2, Hue3, Hue4, Hue5, Hue6, Hue7, Hue8, Saturation, Value;
    void setup(void) {
      //Set the pin we want the ISR to toggle for output.
      pinMode(2,OUTPUT);
      pinMode(3,OUTPUT);
      pinMode(4,OUTPUT);
      pinMode(5,OUTPUT);
      pinMode(6,OUTPUT);
      pinMode(7,OUTPUT);
      pinMode(8,OUTPUT);
      pinMode(12,OUTPUT);  

      pinMode(9,OUTPUT);
      pinMode(10,OUTPUT);
      pinMode(11,OUTPUT);  

      digitalWrite(2, 0); // Turn off LED 4
      digitalWrite(3, 0); // Turn off LED 4
      digitalWrite(4, 0); // Turn off LED 4
      digitalWrite(5, 0); // Turn off LED 4
      digitalWrite(6, 0); // Turn off LED 4
      digitalWrite(7, 0); // Turn off LED 4
      digitalWrite(8, 0); // Turn off LED 4
      digitalWrite(12, 0); // Turn off LED 4  
      digitalWrite(9, 1);
      digitalWrite(10, 1);
      digitalWrite(11, 1);
     
      setPwmFrequency(9, 8);
      setPwmFrequency(10, 8);  
      setPwmFrequency(11, 8);  
      analogWrite(9, 255);
      analogWrite(10, 255);
      analogWrite(11, 255);
     
      LEDValues[0][0] = 100;
      LEDValues[0][1] = 0;
      LEDValues[0][2] = 20;
     
      LEDValues[1][0] = 0;
      LEDValues[1][1] = 30;
      LEDValues[1][2] = 144;

      LEDValues[2][0] = 66;
      LEDValues[2][1] = 245;
      LEDValues[2][2] = 3;

      LEDValues[3][0] = 30;
      LEDValues[3][1] = 30;
      LEDValues[3][2] = 200;

      //Start up the serial port
      Serial.begin(19200);
     
      //Signal the program start
      Serial.println("RGB LED Controller");
     
      // Enable Timer 2 interrupt (also used for PWM though)
      // This interrupt is divided by a prescaler, and takes care of the multiplexing
      TIMSK2 = 1<<TOIE2;
     
      Hue1 = 0;
      Hue2 = 10;
      Hue3 = 20;
      Hue4 = 30;
      Hue5 = 40;
      Hue6 = 50;
      Hue7 = 60;
      Hue8 = 70;  
      Saturation = 255;
      Value = 255;
    }

    unsigned char incomingByte = 0;
    unsigned char getNumPos = 0;
    unsigned char tempNum = 0;
    unsigned char LEDSetNum = 0;
    unsigned char LEDSetColor = 0;

    void loop(void)
    {
        delay(20);
        HSVtoRGB(&Red, &Green, &Blue, Hue1, Saturation, Value);
       
        LEDValues[0][0] = Red;
        LEDValues[0][1] = Green;
        LEDValues[0][2] = Blue;
       
        Hue1++;
        if (Hue1 > 359)
          Hue1 = 0;
         
        HSVtoRGB(&Red, &Green, &Blue, Hue2, Saturation, Value);
       
        LEDValues[1][0] = Red;
        LEDValues[1][1] = Green;
        LEDValues[1][2] = Blue;
       
        Hue2++;
        if (Hue2 > 359)
          Hue2 = 0;
         
        HSVtoRGB(&Red, &Green, &Blue, Hue3, Saturation, Value);
       
        LEDValues[2][0] = Red;
        LEDValues[2][1] = Green;
        LEDValues[2][2] = Blue;
       
        Hue3++;
        if (Hue3 > 359)
          Hue3 = 0;
     
        HSVtoRGB(&Red, &Green, &Blue, Hue4, Saturation, Value);
       
        LEDValues[3][0] = Red;
        LEDValues[3][1] = Green;
        LEDValues[3][2] = Blue;
       
        Hue4++;
        if (Hue4 > 359)
          Hue4 = 0;  
     
        HSVtoRGB(&Red, &Green, &Blue, Hue5, Saturation, Value);
       
        LEDValues[4][0] = Red;
        LEDValues[4][1] = Green;
        LEDValues[4][2] = Blue;
       
        Hue5++;
        if (Hue5 > 359)
          Hue5 = 0;  

        HSVtoRGB(&Red, &Green, &Blue, Hue6, Saturation, Value);
       
        LEDValues[5][0] = Red;
        LEDValues[5][1] = Green;
        LEDValues[5][2] = Blue;
       
        Hue6++;
        if (Hue6 > 359)
          Hue6 = 0;  

        HSVtoRGB(&Red, &Green, &Blue, Hue7, Saturation, Value);
       
        LEDValues[6][0] = Red;
        LEDValues[6][1] = Green;
        LEDValues[6][2] = Blue;
       
        Hue7++;
        if (Hue7 > 359)
          Hue7 = 0;        
         
        HSVtoRGB(&Red, &Green, &Blue, Hue8, Saturation, Value);
       
        LEDValues[7][0] = Red;
        LEDValues[7][1] = Green;
        LEDValues[7][2] = Blue;
       
        Hue8++;
        if (Hue8 > 359)
          Hue8 = 0;        
    }

    void HSVtoRGB( int  *r, int *g,int *b, int h, int s, int v )
    {
            int f;
            long p, q, t;
            if( s == 0 )
            {
                    *r = *g = *b = v;
                    return;
            }
            f = ((h%60)*255)/60;
            h /= 60;
          p = (v * (256 - s)) / 256;
          q = (v * ( 256 - (s * f)/256 ))/256;    
          t = (v * ( 256 - (s * ( 256 - f ))/256))/256;
            switch( h ) {
                    case 0:
                            *r = v;
                            *g = t;
                            *b = p;
                            break;
                    case 1:
                            *r = q;
                            *g = v;
                            *b = p;
                            break;
                    case 2:
                            *r = p;
                            *g = v;
                            *b = t;
                            break;
                    case 3:
                            *r = p;
                            *g = q;
                            *b = v;
                            break;
                    case 4:
                            *r = t;
                            *g = p;
                            *b = v;
                            break;
                    default:
                            *r = v;
                            *g = p;
                            *b = q;
                            break;
            }      
    }
     
  10. Aziza

    Aziza Нерд

  11. acos

    acos Официальный гик Администратор

    ммм. немного не так. Когда я говорил, что можно обойтись без транзисторов, я имел ввиду, что можно обойтись без транзисторов) А если вы решили всё-таки использовать транзисторы (это более правильно, но требует обвязки) то нужно к ним добавить ещё и обвязку в виде резисторов, как на той схеме выше (только R4, R5, R6 должны быть на 220 Ом)
    Простите, что капитаню. Решили с транзисторами - похвально, только добавьте между ардуиной и базой транзисторов резистор на 1 кОм.
    Далее. Не занимайте выводы 0 и 1 ардуины - они вам понадобятся для отладки.
    Пины, которые идут на R, G и B нужно подключить на пины 9,10 и 11.
    A4 и A5 не занимайте. Оставшиеся можно использовать для ULN2003.

    Ссылка не открывается. Код надо будет сильно модифицировать
     
  12. Aziza

    Aziza Нерд

    вот мы убрали транзисторы и два леда.
    У нас появился ритм плавного загорания и потухания, но цвет только красный.
     

    Вложения:

    • rgb.fzz.zip
      Размер файла:
      24,5 КБ
      Просмотров:
      298
  13. acos

    acos Официальный гик Администратор

    Это с каким кодом? с тем что сверху?
    А какой эффект хотите получить то в итоге? Сейчас попробую накидать для этой схемы какую-нибудь переливалку
     
  14. Aziza

    Aziza Нерд

    спасибо, все получилось.
    осталось, подключить датчик, чтоб он реагировал на трение.
     
  15. acos

    acos Официальный гик Администратор

    Что получилось "Всё"? :) Ну поделитесь) и кодом тоже
     
  16. Aziza

    Aziza Нерд

    Код (Text):
    unsigned char Prescaler = 0;
    #define PrescalerOverflowValue 4
    ISR(TIMER2_OVF_vect)
    {
      if (Prescaler < PrescalerOverflowValue)
        Prescaler++;
      else {
        Prescaler = 0;
        Multiplex();
      }
    }


    unsigned char CurrentLED = 1;
    unsigned char LEDValues[8][3];
    bool LEDMoveDir[8][3];
    void Multiplex(void)
    {  
      PORTD &= 0b00000011; // Control pin 0-5
      PORTB &= 0b11101110; // Control pin 6-7
     
      analogWrite(9, 255-LEDValues[CurrentLED][0]);
      analogWrite(10, 255-LEDValues[CurrentLED][1]);
      analogWrite(11, 255-LEDValues[CurrentLED][2]);
     
      switch (CurrentLED)
      {
        case 0:
          //digitalWrite(2, 1); // Turn on LED 1
          PORTD |= 0b00000100;      
          break;
        case 1:
          //digitalWrite(3, 1); // Turn on LED 1
          PORTD |= 0b00001000;            
          break;
        case 2:
          //digitalWrite(4, 1); // Turn on LED 1
          PORTD |= 0b00010000;            
          break;
        case 3:
          //digitalWrite(5, 1); // Turn on LED 1
          PORTD |= 0b00100000;                  
          break;
        case 4:
          //digitalWrite(6, 1); // Turn on LED 1
          PORTD |= 0b01000000;      
          break;
        case 5:
          //digitalWrite(7, 1); // Turn on LED 1
          PORTD |= 0b10000000;            
          break;
        case 6:
          //digitalWrite(8, 1); // Turn on LED 1
          PORTB |= 0b00000001;            
          break;
        case 7:
          //digitalWrite(12, 1); // Turn on LED 1
          PORTB |= 0b00010000;                  
          break;    
      }  

      CurrentLED++;
      if (CurrentLED > 7)
        CurrentLED = 0;
    }

    void setPwmFrequency(int pin, int divisor) {
      byte mode;
      if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
        switch(divisor) {
          case 1: mode = 0x01; break;
          case 8: mode = 0x02; break;
          case 64: mode = 0x03; break;
          case 256: mode = 0x04; break;
          case 1024: mode = 0x05; break;
          default: return;
        }
        if(pin == 5 || pin == 6) {
          TCCR0B = TCCR0B & 0b11111000 | mode;
        } else {
          TCCR1B = TCCR1B & 0b11111000 | mode;
        }
      } else if(pin == 3 || pin == 11) {
        switch(divisor) {
          case 1: mode = 0x01; break;
          case 8: mode = 0x02; break;
          case 32: mode = 0x03; break;
          case 64: mode = 0x04; break;
          case 128: mode = 0x05; break;
          case 256: mode = 0x06; break;
          case 1024: mode = 0x7; break;
          default: return;
        }
        TCCR2B = TCCR2B & 0b11111000 | mode;
      }
    }

    int Red, Green, Blue;
    int Hue1, Hue2, Hue3, Hue4, Hue5, Hue6, Hue7, Hue8, Saturation, Value;
    void setup(void) {
      //Set the pin we want the ISR to toggle for output.
      pinMode(2,OUTPUT);
      pinMode(3,OUTPUT);
      pinMode(4,OUTPUT);
      pinMode(5,OUTPUT);
      pinMode(6,OUTPUT);
      pinMode(7,OUTPUT);
      pinMode(8,OUTPUT);
      pinMode(12,OUTPUT);  

      pinMode(9,OUTPUT);
      pinMode(10,OUTPUT);
      pinMode(11,OUTPUT);  

      digitalWrite(2, 0); // Turn off LED 4
      digitalWrite(3, 0); // Turn off LED 4
      digitalWrite(4, 0); // Turn off LED 4
      digitalWrite(5, 0); // Turn off LED 4
      digitalWrite(6, 0); // Turn off LED 4
      digitalWrite(7, 0); // Turn off LED 4
      digitalWrite(8, 0); // Turn off LED 4
      digitalWrite(12, 0); // Turn off LED 4  
      digitalWrite(9, 1);
      digitalWrite(10, 1);
      digitalWrite(11, 1);
     
      setPwmFrequency(9, 8);
      setPwmFrequency(10, 8);  
      setPwmFrequency(11, 8);  
      analogWrite(9, 255);
      analogWrite(10, 255);
      analogWrite(11, 255);
     
      LEDValues[0][0] = 100;
      LEDValues[0][1] = 0;
      LEDValues[0][2] = 20;
     
      LEDValues[1][0] = 0;
      LEDValues[1][1] = 30;
      LEDValues[1][2] = 144;

      LEDValues[2][0] = 66;
      LEDValues[2][1] = 245;
      LEDValues[2][2] = 3;

      LEDValues[3][0] = 30;
      LEDValues[3][1] = 30;
      LEDValues[3][2] = 200;

      //Start up the serial port
      Serial.begin(19200);
     
      //Signal the program start
      Serial.println("RGB LED Controller");
     
      // Enable Timer 2 interrupt (also used for PWM though)
      // This interrupt is divided by a prescaler, and takes care of the multiplexing
      TIMSK2 = 1<<TOIE2;
     
      Hue1 = 0;
      Hue2 = 10;
      Hue3 = 20;
      Hue4 = 30;
      Hue5 = 40;
      Hue6 = 50;
      Hue7 = 60;
      Hue8 = 70;  
      Saturation = 255;
      Value = 255;
    }

    unsigned char incomingByte = 0;
    unsigned char getNumPos = 0;
    unsigned char tempNum = 0;
    unsigned char LEDSetNum = 0;
    unsigned char LEDSetColor = 0;

    void loop(void)
    {
        delay(20);
        HSVtoRGB(&Red, &Green, &Blue, Hue1, Saturation, Value);
       
        LEDValues[0][0] = Red;
        LEDValues[0][1] = Green;
        LEDValues[0][2] = Blue;
       
        Hue1++;
        if (Hue1 > 359)
          Hue1 = 0;
         
        HSVtoRGB(&Red, &Green, &Blue, Hue2, Saturation, Value);
       
        LEDValues[1][0] = Red;
        LEDValues[1][1] = Green;
        LEDValues[1][2] = Blue;
       
        Hue2++;
        if (Hue2 > 359)
          Hue2 = 0;
         
        HSVtoRGB(&Red, &Green, &Blue, Hue3, Saturation, Value);
       
        LEDValues[2][0] = Red;
        LEDValues[2][1] = Green;
        LEDValues[2][2] = Blue;
       
        Hue3++;
        if (Hue3 > 359)
          Hue3 = 0;
     
        HSVtoRGB(&Red, &Green, &Blue, Hue4, Saturation, Value);
       
        LEDValues[3][0] = Red;
        LEDValues[3][1] = Green;
        LEDValues[3][2] = Blue;
       
        Hue4++;
        if (Hue4 > 359)
          Hue4 = 0;  
     
        HSVtoRGB(&Red, &Green, &Blue, Hue5, Saturation, Value);
       
        LEDValues[4][0] = Red;
        LEDValues[4][1] = Green;
        LEDValues[4][2] = Blue;
       
        Hue5++;
        if (Hue5 > 359)
          Hue5 = 0;  

        HSVtoRGB(&Red, &Green, &Blue, Hue6, Saturation, Value);
       
        LEDValues[5][0] = Red;
        LEDValues[5][1] = Green;
        LEDValues[5][2] = Blue;
       
        Hue6++;
        if (Hue6 > 359)
          Hue6 = 0;  

        HSVtoRGB(&Red, &Green, &Blue, Hue7, Saturation, Value);
       
        LEDValues[6][0] = Red;
        LEDValues[6][1] = Green;
        LEDValues[6][2] = Blue;
       
        Hue7++;
        if (Hue7 > 359)
          Hue7 = 0;        
         
        HSVtoRGB(&Red, &Green, &Blue, Hue8, Saturation, Value);
       
        LEDValues[7][0] = Red;
        LEDValues[7][1] = Green;
        LEDValues[7][2] = Blue;
       
        Hue8++;
        if (Hue8 > 359)
          Hue8 = 0;        
    }

    void HSVtoRGB( int  *r, int *g,int *b, int h, int s, int v )
    {
            int f;
            long p, q, t;
            if( s == 0 )
            {
                    *r = *g = *b = v;
                    return;
            }
            f = ((h%60)*255)/60;
            h /= 60;
          p = (v * (256 - s)) / 256;
          q = (v * ( 256 - (s * f)/256 ))/256;    
          t = (v * ( 256 - (s * ( 256 - f ))/256))/256;
            switch( h ) {
                    case 0:
                            *r = v;
                            *g = t;
                            *b = p;
                            break;
                    case 1:
                            *r = q;
                            *g = v;
                            *b = p;
                            break;
                    case 2:
                            *r = p;
                            *g = v;
                            *b = t;
                            break;
                    case 3:
                            *r = p;
                            *g = q;
                            *b = v;
                            break;
                    case 4:
                            *r = t;
                            *g = p;
                            *b = v;
                            break;
                    default:
                            *r = v;
                            *g = p;
                            *b = q;
                            break;
            }      
    }
     
    Код, который мы использовали.

    Теперь нам надо подключить Touch Sensor.
    1 - Как его подключить к самим LED-ам?
    2 - Как его закодировать, чтобы наша лампа меняла яркость в зависимости от скорости трения: чем медленнее трешь, тем медленнее перелив цвета и лампа менее яркая, и наоборот, чем быстрее трение, тем быстрее перелив цвета и лампа горит ярче.
     

    Вложения:

    • DbLWCZ2L25c.jpg
      DbLWCZ2L25c.jpg
      Размер файла:
      51,3 КБ
      Просмотров:
      436
    • Jj4ngCDNTa4.jpg
      Jj4ngCDNTa4.jpg
      Размер файла:
      52 КБ
      Просмотров:
      412
    • Jj4ngCDNTa4.jpg
      Jj4ngCDNTa4.jpg
      Размер файла:
      52 КБ
      Просмотров:
      738
  17. Aziza

    Aziza Нерд

     
  18. Aziza

    Aziza Нерд

  19. Aziza

    Aziza Нерд

     
  20. acos

    acos Официальный гик Администратор

    Пробуйте
     

    Вложения: