Ovdje pročitajte kako se registrirati na forum.

Upravljanje step motorom Driver tcm2100

Zapeli ste s projektom? Ovdje je pravo mjesto za postaviti pitanje. Imajte na umu da ekipa e-radionice neće uvijek i/ili redovno odgovarati na pitanja postavljena u ovom podforumu.
Odgovorite
Avatar
vorbuk#3347
Novak
Novak
Postovi: 3
Pridružen/a: pon tra 29, 2019 2:17 pm

Upravljanje step motorom Driver tcm2100

Post Postao/la vorbuk#3347 » sri svi 15, 2019 1:25 pm

Postovani,

potrebna mi je pomoc oko jednog projekta. Na projektu koristim sljedecu opremu;

Motor nema 14: https://www.pololu.com/product/1209
Motor driver tcm2100: https://www.watterott.com/en/SilentStepStick-TMC2100-5V


slika
slika


Zadatak je upravljanje step motorom u svrhu otvaranja i zatvaranja jednog mehanizma koji izgleda kao kisobran. Profesorica zahtjeva da moj tcm2100 meni vrati povratnu informaciju na arduina da je odradio step tj primio impuls kako mu je arudino program naredio tako da znam u kojoj je tocno poziciji mehanizam. Koristio sam program iz croduino tutoriala s driverom A4988.
Ona tvrdi da je to moguce postici preko drivera a posto bas nisam upucen u to previse ne mogu skontat kako to postici. Ugl moje pitanje je koji pin u tome slucaju koristiti i da li je potreban neki vanjski dodatni enkoder za postizanje te povratne informacije ili driveri sami po sebi mogu vratiti tu informaciju. Npr moze li to ijedan driver kao A4988?

Unaprijed hvala ljudi :)
Avatar
david.zovko#9611
e-radionica.com team
e-radionica.com team
Postovi: 206
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Upravljanje step motorom Driver tcm2100

Post Postao/la david.zovko#9611 » pon svi 20, 2019 9:30 am

Jesli li probao pročitati datasheet od TCM2100 da bi vidio jel ima nekakvu povratnu vezu? Nisam nikada radio s baš tim driverom, ali generalno takvi step driveri nemaju nikakav feedback. To su obično chipovi s jednostavnijom logikom i MOSFETima da bi mogli gurati velike struje kroz motor. Znam A4988 nema nikakav feedback.

Prelistaj datasheet pa vidi jel ima driver kakav feedback. To je prvi korak. Ako nema, morat ćeš imat dodatni senzor koji će detektirati pomak.
Avatar
vorbuk#3347
Novak
Novak
Postovi: 3
Pridružen/a: pon tra 29, 2019 2:17 pm

Re: Upravljanje step motorom Driver tcm2100

Post Postao/la vorbuk#3347 » pon svi 20, 2019 2:14 pm

TCM2100 nema povratnu vezu. Kao prvo motor koji koristim nema ugrađen enkoder za detekciju pomaka.
Moze li tko pomoci oko koda za komunikaciju. Ugl svrha je da jedan motor oponasa drugi. Ima li ko neku ideju ili neki link koji bi mogao pomoci jer nikada prije nisam radio projekt toga tipa. Potrebno je preko modula nrf24L01+ slati dvije informacije slave motoru a to su dir i step. Koji je najbolji nacin za slati informacije da citam sto se nalazi na izlazima digitalnih pinova master motora i saljem to ili da postavim neki int.
Hvala na pomoci.
Avatar
david.zovko#9611
e-radionica.com team
e-radionica.com team
Postovi: 206
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Upravljanje step motorom Driver tcm2100

Post Postao/la david.zovko#9611 » uto svi 21, 2019 9:38 am

Generalno pravilo na online forumima je: prvo probaj nešto sam, a mi ćemo ti pomoći da dođeš tamo :) moraš pokazati interes i volju, a onda će i drugi rado pomoći riješiti probleme koji se nađu na putu.

Kreni s ostvarivanjem komunikacije između dva NRF24L01 modula. Za to ćeš pronaći hrpu primjera na netu, pa čak i naš KKM na hrvatskom jeziku.
Onda izmjeni informacije koje šalješ tako da šalješ točno to što trebaš.
Spoji zajedno s kodom za upravljanje motorom i to je to!

Probleme na koje naiđeš slobodno pitaj, uz objašnjenje što si do sada pokušao, gdje misliš da je problem i programski kod kojega si koristio.

Koji je najbolji nacin za slati informacije da citam sto se nalazi na izlazima digitalnih pinova master motora i saljem to ili da postavim neki int
Ako ti je to isti programski kod, bolje je koristiti varijable koje koristiš za postavljanje pinova motora. Ako je to neki drugi kod, onda čitaš stanje pinova i to šalješ!
domagoj#6556
Hobist
Hobist
Postovi: 61
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Re: Upravljanje step motorom Driver tcm2100

Post Postao/la domagoj#6556 » uto svi 21, 2019 10:28 am

Da se nadovežem na diskusiju. Imam dva primjera s nRF24L01 s kojima sam isprobavao kako stvarčica radi, možda budu od pomoći.
Prijemnik:

Kod: Označite sve

#include <SPI.h> 
#include <nRF24L01.h> 
#include <RF24.h> 

RF24 radio(9, 10); // CE, CSN 
const byte adresa[] = "Adr01"; //adresa je 5 bytova i mogu biti i slova
unsigned long broj,zadnji_broj;
int sekunde,greska;

void setup() { 
  int i;
  Serial.begin(9600);
  radio.begin();
  Serial.println("nRF24 Receiver");
  Serial.print("Adresa: "); for(i=0;i<5;i++) Serial.print((char)adresa[i]); Serial.println();
  radio.openReadingPipe(0,adresa);
  if(!radio.setDataRate(RF24_250KBPS)) //smanji brzinu radi boljeg prijema
    Serial.println("Neuspjeli pokusaj postavljanja namanje brzine");
  radio.setCRCLength(RF24_CRC_8);
  radio.setRetries(15,15); //delay, pokušaji, 15 je max vrijednost
  radio.setPALevel(RF24_PA_MAX); //mogući izbor: RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.startListening(); //prebaci se u prijem
 } 
 
void loop() { 
  if(radio.available())
  {
    while(radio.available())
      radio.read(&broj, sizeof(broj));
    if((zadnji_broj+1)<broj) //ako je predajnik resetiran, zadnji broj u prijemniku nikako ne može biti manji od zadnjeg broja u predajniku
      greska++;              //pa se greška neće evidentirati sve dok predajnik ne počne generirati veće brojeve od prijemnika
    zadnji_broj=broj;        //u toj situaciji treba resetirati prijemnik, odnosno ako se resetira predajnik, nakon njega treba resetirati i prijemnik
    Serial.print("Primio: "); Serial.print(broj); Serial.print(" Gresaka: "); Serial.print(greska);
    Serial.print( " %="); Serial.print(int((float)greska/broj*100));
    Serial.print(" Sekunde: "); Serial.println(sekunde);
    sekunde=0;
  }

  if(Pause_1((unsigned long)1000))
  {
    sekunde++;
  }
  
  if(sekunde==30)
  {
    sekunde=0;
    Serial.println("Kontrolna poruka");
  }
    
} //end loop 

bool Pause_1(unsigned long pause) //pause=vrijeme u ms
{
  static bool start; //start=true -> timer je pokrenut
  static unsigned long Start_Time; //vrijeme pokretanja
  unsigned long Current_Time=millis();
  //Serial.println(Current_Time);
  if(pause==0) { start=false; return false; } //ako je vrijeme 0 zaustavlja timer
  if(start!=true) //ako mjerenje nije pokrenuto, pokreni ga
  {
    start=true;
    Start_Time=Current_Time; //očitaj vrijeme pokretanja, može biti i micros()
    return false;
  }
  if(start==true) //ako je mjerenje pokrenuto
  {
    if((Current_Time-Start_Time)>=pause) //ako je prošlo zadano vrijeme zaustavi timer
    {
      start=false; //zaustavlja timer
      return true; //vrijeme je isteklo
    }
    else
      return false; //vrijeme još nije isteklo
  }
}//end Pause_1
Odašiljač:

Kod: Označite sve

#include <SPI.h> 
#include <nRF24L01.h> 
#include <RF24.h> 

RF24 radio(9, 10); // CE, CSN 
const byte adresa[] = "Adr01"; //adresa je 5 bytova i mogu biti i slova
unsigned long broj,sekunde;
 
void setup() 
{ 
  int i;
  Serial.begin(9600);
  radio.begin();
  Serial.println("nRF24 Transmitter");
  Serial.print("Adresa: "); for(i=0;i<5;i++) Serial.print((char)adresa[i]); Serial.println();
  radio.openWritingPipe(adresa);
  if(!radio.setDataRate(RF24_250KBPS)) //smanji brzinu radi boljeg prijema
    Serial.println("Neuspjeli pokusaj postavljanja namanje brzine");
  radio.setCRCLength(RF24_CRC_8);
  radio.setRetries(15,15); //delay, pokušaji, 15 je max vrijednost
  radio.setPALevel(RF24_PA_MAX); //mogući izbor: RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.stopListening(); //prebaci se u predaju
 } //end setup
 
void loop()
{ 
  if(Pause_1((unsigned long)1000))
  {
    if(sekunde>=30 && sekunde<60) //zadnjih 30 s šalji broj
    {
      if((sekunde % 2)==0) //šalji sami kad su sekunde paran broj
      {
        Serial.print("\nSaljem: "); Serial.println(broj);
        radio.write(&broj, sizeof(broj)); 
      }
    }
    if(sekunde>=60)
    {
      broj++;
      sekunde=0;
    }
    sekunde++;
    Serial.print("+");
  }
} //end loop

//Milisekunde
bool Pause_1(unsigned long pause) //pause=vrijeme u ms
{
  static bool start; //start=true -> timer je pokrenut
  static unsigned long Start_Time; //vrijeme pokretanja
  unsigned long Current_Time=millis();
  //Serial.println(Current_Time);
  if(pause==0) { start=false; return false; } //ako je vrijeme 0 zaustavlja timer
  if(start!=true) //ako mjerenje nije pokrenuto, pokreni ga
  {
    start=true;
    Start_Time=Current_Time; //očitaj vrijeme pokretanja, može biti i micros()
    return false;
  }
  if(start==true) //ako je mjerenje pokrenuto
  {
    if((Current_Time-Start_Time)>=pause) //ako je prošlo zadano vrijeme zaustavi timer
    {
      start=false; //zaustavlja timer
      return true; //vrijeme je isteklo
    }
    else
      return false; //vrijeme još nije isteklo
  }
}//end Pause_1
Pozdrav, Domagoj
Avatar
vorbuk#3347
Novak
Novak
Postovi: 3
Pridružen/a: pon tra 29, 2019 2:17 pm

Re: Upravljanje step motorom Driver tcm2100

Post Postao/la vorbuk#3347 » pet svi 24, 2019 6:31 pm

Eto mene opet. Ugl bilo mi je nezgodno stavit ovaj kod jer fakat nisam dobar u programiranju a ovo moram napravit, a bas nemam pomoc od nikoga zivoga oko sebe. Ugl evo uspio sam poslati sa mastera na slave neku informaciju. Kao sto vidite ako kuzite ovo moje umjetnicko djelo nastojao sam mu poslati samo naredbu za step da se vrti i po pokusu se on vrti ali ne glatko na serial monitoru dobivam 1 i 0 na strani slavea ali nekad se zna dogoditi da dodu za redom 111101011010101100 da se bitovni ponavljaju sto mi nikako nije u interesu, step motor bi trebao raditi 0 1 0 1.... Ima li neka solucija za to?

Sad je moje pitanje, posto bas nisam siguran jeli ovo uopce treba ici ovako, kako poslati naredbu za direction? Pokusao sam ubacivati kao i za step isti redosljed na masteru ali onda se skroz izblesira slave s sljanjem te dvije informacije.
*Ok homing sam za sada iskljucio jer hocu dobiti samo normalno kretanje slavea kako mu master salje impulse.
Jos jednom isprike ali ako mozete pomoci kako bi bih vam jako jako jako zahvalan ili barem uputiti na neke korisne linkove.

Master:

Kod: Označite sve

// Library
#include <RF24.h>
#include <RF24Network.h>
#include <SPI.h>
#include <AccelStepper.h>


int x;

// Define the Pins used
#define step_pin 6    // Pin 8 povezan je na step pin TCM2100 drivera
#define dir_pin 5     // Pin 9 povezan je na dir pin TCM2100 drivera
#define pin_pin 10    // Pin 10 HIGH
#define home_switch 9 // Pin 11 povezan je na srednji pin pocetnog prekidaca (MicroSwitch)


RF24 radio(7, 8);             // nRF24L01 (CE,CSN)
RF24Network network(radio);   // Include the radio in the network
const uint16_t lider = 00;
const uint16_t ptica1 = 01;
const uint16_t ptica2 = 02;
const uint16_t ptica3 = 03;
const uint16_t ptica4 = 04;

const unsigned long interval = 0.000001 ;  //ms  // How often to send data to the other unit
unsigned long last_sent;            // When did we last send?


void setup() {

   Serial.begin(57600);
   SPI.begin();
   radio.begin();
   network.begin(90, lider);  //(channel, node address)
   radio.setDataRate(RF24_1MBPS);
    
   pinMode(pin_pin, OUTPUT);
   pinMode(dir_pin, OUTPUT);
   pinMode(step_pin, OUTPUT);
   pinMode(home_switch, INPUT_PULLUP);

}

void loop() {

   
    digitalWrite(dir_pin,LOW); // Postavljanje pina dir na HIGH, kako bi se motor vrtio u jednu stranu
  // Slanje 200 impulsa na step pin kako bi motor napravio 200 koraka
    for(int x = 0; x < 3200; x++) {
    digitalWrite(step_pin,HIGH); //postavljanje HIGH na step pin
    delayMicroseconds(100);   //postavljanje širine HIGH dijela impulsa na 5 ms (minimum za driver je 1 us)
    digitalWrite(step_pin,LOW); //postavljanje LOW na step pin
    delayMicroseconds(400); //postavljanje širine LOW dijela impulsa na 5 ms (minimum za driver je 1 us)
    Serial.println(x);
    unsigned long stepState = digitalRead(x);
    RF24NetworkHeader header1(ptica1);    // (Address where the data is going)
    bool ok2 = network.write(header1, &stepState, sizeof(stepState)); // Send the data
   
    }  
    
 delay(400);
}

Slave:

Kod: Označite sve

// Library
#include <RF24.h>
#include <RF24Network.h>
#include <SPI.h>
#include <AccelStepper.h>


// Pinovi koji se koriste
#define step_pin 6    // Pin 8 povezan je na step pin TCM2100 drivera
#define dir_pin 5     // Pin 9 povezan je na dir pin TCM2100 drivera
#define pin_pin 10    // Pin 10 logicko napajanje 5V 
#define home_switch 9 // Pin 11 povezan je na srednji pin pocetnog prekidaca (MicroSwitch)


RF24 radio(7, 8);             // nRF24L01 (CE,CSN)
RF24Network network(radio);   // Include the radio in the network
const uint16_t lider = 00;
const uint16_t ptica1 = 01;

const unsigned long interval = 0.001;  //ms  // How often to send data to the other unit
unsigned long last_sent;            // When did we last send?


void setup() {

  Serial.begin(57600);
  SPI.begin();
  radio.begin();
  network.begin(90, ptica1);  //(channel, node address)
  radio.setDataRate(RF24_1MBPS);

  pinMode(pin_pin, OUTPUT);
  pinMode(dir_pin, OUTPUT);  
  pinMode(step_pin, OUTPUT);
  pinMode(home_switch, INPUT_PULLUP);
 
    
  }


void loop() {
    network.update();
    while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header1;
    unsigned long stepState;
    network.read(header1, &stepState, sizeof(stepState));
    digitalWrite(step_pin,!stepState);
    Serial.println(stepState);
    }    
  
}
Odgovorite