Arduino Polska Forum
Sterowanie silnikiem DC poprzez IR - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Sterowanie silnikiem DC poprzez IR (/watek-sterowanie-silnikiem-dc-poprzez-ir)



Sterowanie silnikiem DC poprzez IR - arogant - 15-06-2017

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


RE: Sterowanie silnikiem DC poprzez IR - adix - 16-06-2017

Po kasz układ schemat połączeń .


RE: Sterowanie silnikiem DC poprzez IR - arogant - 16-06-2017

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


RE: Sterowanie silnikiem DC poprzez IR - arogant - 19-06-2017

ktoś coś? bardzo pilnie tego potrzebuje..


RE: Sterowanie silnikiem DC poprzez IR - Smaczek - 20-06-2017

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.


RE: Sterowanie silnikiem DC poprzez IR - Smaczek - 22-06-2017

(19-06-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