• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie silnikiem DC poprzez IR
#1
Cześć. Mam zamiar zrobić silniki DC sterowane pilotem ale jak narazie wszystko idzie jak najgorzej...
Po podłączeniu całego układu oraz podczerwieni napisałem sterownik który na chłopski rozum powinien działać ale nie chce...
Co rozumiem poprzez nie chce? Po klikaniu na przyciski +/- PWM zmniejsza się i zwiększa lecz silnik nie startuje... dopiero gdy PWM dojdzie do 255 to silnik gwałtownie rusza..
Pomoże ktoś aby silnik powolutku przy każdym naciśnięciu przycisku ruszał coraz to szybciej lub wolniej?
Niżej zamieszczam cały kod:


Kod:
#include <IRremote.h>
#define irPin 3
IRrecv irrecv(irPin);
decode_results results;
int pwm = 50;

void setup() {
 pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1
 pinMode(10, OUTPUT);
 
 pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
 pinMode(8, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);
    Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
     switch (results.value){
       case 0x1002C2D:
         pwm=pwm+5;
         Serial.print("+ ");
         Serial.println(pwm);
         analogWrite(6, pwm);
         digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
         digitalWrite(8, HIGH);
         analogWrite(10, pwm);
         digitalWrite(11, LOW);
         digitalWrite(12, HIGH);
       break;

       case 0x100ACAD:
         pwm=pwm-5;
         Serial.print("- ");
         Serial.println(pwm);
         analogWrite(6, pwm);
         digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo
         digitalWrite(8, HIGH);
         analogWrite(10, pwm);
         digitalWrite(11, LOW);
         digitalWrite(12, HIGH);
       break;

       case 0x1009293:
         analogWrite(6, pwm);
         analogWrite(10, pwm);
         digitalWrite(6, LOW);
         digitalWrite(8, HIGH);
         digitalWrite(11, LOW);
         digitalWrite(12, HIGH);
         break;

       default:
       Serial.print("Nie zostałem zaprogramowany dla tego przycisku.. Jest to: ");
       Serial.print("0x");
       Serial.println(results.value, HEX);
       break;
     }
     irrecv.resume();
     }
}



napewno nie jest to wina złego podłączenia do sterownika, bo poprzez pętle for normalnie silnik się rozpędza.. Prosze o pomoc, pozdrawiam Smile
 
Odpowiedź
#2
Po kasz układ schemat połączeń .
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#3
zrobiłem to na symulatorze, tylko że nie da się w nim podłączyć zasilania przez co cały projekt nie działa..
https://circuits.io/circuits/5244706-silniki-2xdc-ir
myślisz że mam błąd w połączeniach? Według mnie wszystko jest dobrze
 
Odpowiedź
#4
ktoś coś? bardzo pilnie tego potrzebuje..
 
Odpowiedź
#5
Witam,
Nie przeglądałem specyfikacji sterownika, którego zastosowałeś, ale w przypadku niektórych do sterowania należy dać na jeden biegun silnika masę, a na drugi PWM. Ty na oba (6 i 10) dajesz PWM. Może tu tkwi przyczyna?
Pozdrawiam,
Tomek.
 
Odpowiedź
#6
(06-19-2017, 17:52)arogant napisał(a): ktoś coś? bardzo pilnie tego potrzebuje..
Witam,

Nie wiem jakiej biblioteki kolega używa, ale u mnie poniższy kod działa. Wypróbowany został z użyciem jednego silnika i sterownika gdzie ruch silnika określa się podając na jedno wejście masę, na drugie sygnał PWM.
Kod:
// dla TSOP2236- patrząc od strony wypukłości
// środkowa nozka ++
// prawa GND
// lewa OUT

#include <IRremote.h>

#include <LiquidCrystal_I2C.h>

#define motor1Pin 9

#define ON 0xFFB04F
#define OFF 0xFFF807
#define PLUS 0xFF906F
#define MINUS 0xFFB847

byte RECV_PIN = 11; // pin zczytujacy z odbiornika IR
byte led_pin = 13;

int pwm;

LiquidCrystal_I2C lcd(0x3f, 16, 2);

IRrecv irrecv(RECV_PIN);
decode_results results;


void setup()
{
  pinMode(led_pin, OUTPUT);
  pinMode(motor1Pin, OUTPUT);
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);

  irrecv.enableIRIn(); // Start the receiver

  pwm = 0;
  analogWrite(motor1Pin, pwm);
}

void loop() {
  if (irrecv.decode(&results)) {
    // wyswietlanie wartosci na lcd
 //   logReceivedCode(results.value);
        irrecv.resume(); // Receive the next value
        
switch (results.value) {
    case ON:
      pwm = 255;
      break;
    case OFF:
      pwm = 0;
      break;
    case PLUS:
      {
      pwm += 10;
      if(pwm > 255) pwm = 255;   
      }
      break;
    case MINUS:
      {
      pwm -= 10;
      if(pwm < 0) pwm = 0;   
      }
      break;  
    default: 
      break;
  }  
  /*
    if (results.value == ON)
    {
     pwm = 255;
 
    }
    if (results.value == OFF)
    {
      pwm = 0;
    }
    if (results.value == PLUS)
    {
     pwm += 10;
     if(pwm > 255) pwm = 255;   
    }
    if (results.value == MINUS)
    {
     pwm -= 10;
     if(pwm < 0) pwm = 0;   
    }
    */
  analogWrite(motor1Pin, pwm); 
  }
  lcd.setCursor(0, 0);
  lcd.print("pwm=");
  lcd.print(pwm);
  lcd.print("   ");
  delay(250);
}

void logReceivedCode(long irCode) {
//  lcd.clear();
//  lcd.setCursor(0, 0);
//  lcd.print(irCode);
//  lcd.setCursor(0, 1);
//  lcd.print(irCode, HEX);
//  lcd.print(" pwm=");
//  lcd.print(pwm);
}

Pozdrawiam,
Smaczek
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości