cyklus for a while podminka

Odpovědět
solarsort
Příspěvky: 3
Registrován: 16 bře 2023, 10:04
Reputation: 0

cyklus for a while podminka

Příspěvek od solarsort » 16 bře 2023, 10:24

Ahoj vsem,

tvorim kod pro ovladani krokoveho motoru pres ethernet. Mam skript ktery se spousti v pythonu zadanim jmena motoru-pocet kroku-speeddelay-smer viz data v kodu.

Kód: Vybrat vše

from socket import *
import time


address = ('192.168.1.2', 5000) #server IP and port
client_socket = socket(AF_INET, SOCK_DGRAM) #Socket
client_socket.settimeout(1)  # wait max 1 sec for answer... if response is expected

#while (1):
data = "motorha-200-1-0"  # settings for motor ... do motor, left, 20 steps, 5 ms delay, dir 1
lst=data.split("-")
stp=int(lst[2])
dey=int(lst[3])


client_socket.sendto(data.encode('utf-8'), address)  # send data request
print(data)	#python output
time.sleep(1)  # delay before sending next command
Dale mam kod pro arduino + ethernet shield + cnc shield + dva endstopy.

Kód: Vybrat vše

#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <stdio.h>
#include <string.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};// randomly choosen MAC Adress
IPAddress ip(192, 168, 1, 2); //Arduino IP Adress. Has to be known of (python) script.
unsigned int localPort = 5000;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
String datReq;
int packetSize;
EthernetUDP Udp;
#define ENABLE 8
#define X_STEP 2
#define Y_STEP 3
#define Z_STEP 4
#define X_DIR  5
#define Y_DIR  6
#define Z_DIR  7
#define X_LIMIT  9

void setup() {
  Serial.begin(115200);
  Ethernet.begin( mac, ip);
  Udp.begin(localPort);
  delay(500);
   // nastavení směrů pro všechny piny
  pinMode(X_STEP, OUTPUT);
  pinMode(Y_STEP, OUTPUT);
  pinMode(Z_STEP, OUTPUT);
  pinMode(X_DIR,  OUTPUT);
  pinMode(Y_DIR,  OUTPUT);
  pinMode(Z_DIR,  OUTPUT);
  pinMode(X_LIMIT,  INPUT_PULLUP);  
  pinMode(ENABLE, OUTPUT);
  //digitalWrite(ENABLE, LOW);
}
void loop() {
  packetSize = Udp.parsePacket(); 
  if (packetSize > 0) {   //request is received if packetSize > 0
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);   
    String datReq(packetBuffer);
    //Serial.print("Raw Input: "); // debug only
    //Serial.println(packetBuffer);
    String actionha = getValue(datReq, '-', 0);  
    //String motor = getValue(datReq, '-', 1); // not implemented yet...
    int stepsha = getValue(datReq, '-', 1).toInt();
    int speedDelayha = getValue(datReq, '-', 2).toInt();
    int dirha = getValue(datReq, '-', 3).toInt();
    String datReqca(packetBuffer);
    //Serial.print("Raw Input: "); // debug only
    //Serial.println(packetBuffer);
    String actionca = getValue(datReqca, '-', 0);  
    //String motorca = getValue(datReqca, '-', 1); // not implemented yet...
    int stepsca = getValue(datReqca, '-', 1).toInt();
    int speedDelayca = getValue(datReqca, '-', 2).toInt();
    int dirca = getValue(datReqca, '-', 3).toInt();
    
    if (actionha == "motorha") {
      moveMotorha(stepsha, speedDelayha, dirha);
    }  
    if (actionca == "motorca") {    
      moveMotorca(stepsca, speedDelayca, dirca);      
    }
    if (actionha == "print") {
      Serial.print("Motor: ");
      //Serial.println(motorha);  // not implemented yet...
      Serial.print("Steps: ");
      Serial.println(stepsha);
      Serial.print("SpeedDelay: ");
      Serial.println(speedDelayha);
      Serial.print("Dir: ");
      Serial.println(dirha);  
    }   
    if (actionca == "print") {
      Serial.print("Motorca: ");
      //Serial.println(motorca);  // not implemented yet...
      Serial.print("Stepsca: ");
      Serial.println(stepsca);
      Serial.print("SpeedDelayca: ");
      Serial.println(speedDelayca);
      Serial.print("Dirca: ");
      Serial.println(dirca);
   }
  }
memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;
  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
} 
void moveMotorha(int stepsha,int speedDelayha, int dirha) {
  // motor selector is not implemented yet...
  Serial.println(speedDelayha);
  if (dirha == 1) {
    digitalWrite(X_DIR, HIGH);
    Serial.println("Dirha is 1");     
  }
  if (dirha == 0) {
    digitalWrite(X_DIR, LOW);
    Serial.println("Dirha is 0");  
  }
  Serial.println("Stepping now!");
  //for (int x = 0; x < stepsha; x++) {
     while (digitalRead(X_LIMIT)) {
      if (dirha == 1) {
        Serial.println("smer 1");
        digitalWrite(X_DIR, LOW);
        digitalWrite(X_STEP, HIGH);
        delay(speedDelayha);                       
        digitalWrite(X_STEP, LOW);
        delay(speedDelayha);
      
      }
       if (dirha == 0){
        Serial.println("smer 0");
        digitalWrite(X_DIR, HIGH);
        digitalWrite(X_STEP, HIGH);
        delay(speedDelayha);                       
        digitalWrite(X_STEP, LOW);
        delay(speedDelayha);  
      }
           
     }
   
     while (!digitalRead(X_LIMIT)) {
      if (dirha == 1) {
    
        digitalWrite(X_DIR, HIGH);
        digitalWrite(X_STEP, HIGH);
        delay(speedDelayha);                       
        digitalWrite(X_STEP, LOW);
        delay(speedDelayha);
         
      } 
      if (dirha == 0) {
        digitalWrite(X_DIR, LOW);
        digitalWrite(X_STEP, HIGH);
        delay(speedDelayha);                       
        digitalWrite(X_STEP, LOW);
        delay(speedDelayha);
        
      }
    
     }
    

  
}
Prvni kod zasle prikaz a druhy kod tento prikaz patricne rozlozi a vykona. Problem mam nasledujici. Kdyz nepouziji cast kodu pro endstopy

Kód: Vybrat vše

while (digitalRead(X_LIMIT))
a

Kód: Vybrat vše

while (!digitalRead(X_LIMIT))
program vykona pozadovany pocet cyklu. Tedy napr pri zadani motorha-200-1-1 motor vykona 200 kroku pri zadanem delay 1 a smeru 1. Podminky while pro endstopy funguji dobre. Kdyz se sepne spinac a dokud je sepnuty tak se zmeni smer otaceni a pohyb se provadi dokud je snimac sepnuty. Tedy kdyz se spinac rozepne motor se zastavi. Nevim ale jak to osetrit take pomoci for smycky tak aby kdyz zadam napr 200 kroku aby se provedly a kdyz dojde k najezdu na koncak tak aby se provedla while procedura. Druhy kod nyni funguje tak ze ac zadam jakekoliv pocet kroku tak motor stepuje dokud nenajede na koncovy spinac. Slo by to nejak osetrit?

Diky.

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: cyklus for a while podminka

Příspěvek od PetrB » 16 bře 2023, 12:12

Ahoj,
já bych tam dal rozšíření podmínky u toho while.
Vypadalo by to nějak takto:

Kód: Vybrat vše

   x=0;
     while (digitalRead(X_LIMIT) && (x<stepsha) {
      ..
      x++;
     }
Cyklus skončí buď dosažením limitní zarážky a nebo po provedení požadovaného počtu kroků.

Případně to můžeš napsat i přes ten for

Kód: Vybrat vše

 for (x=0;(x<stepsha) && digitalRead(X_LIMIT); x++) {
  ..
  }
Naposledy upravil(a) PetrB dne 16 bře 2023, 12:28, celkem upraveno 1 x.

solarsort
Příspěvky: 3
Registrován: 16 bře 2023, 10:04
Reputation: 0

Re: cyklus for a while podminka

Příspěvek od solarsort » 16 bře 2023, 12:27

Dekuji pekne. To je presne to co jsem potreboval. Diky za Vas cas. Cast opraveneho kodu

Kód: Vybrat vše

void moveMotorha(int stepsha,int speedDelayha, int dirha) {
  int x;
  // motor selector is not implemented yet...

  Serial.println(speedDelayha);
  if (dirha == 1) {
    digitalWrite(X_DIR, HIGH);
    Serial.println("Dirha is 1");     
  }
  if (dirha == 0) {
    digitalWrite(X_DIR, LOW);
    Serial.println("Dirha is 0");  
  }
  Serial.println("Stepping now!"); 
   x=0;
     while (digitalRead(X_LIMIT)&& (x<stepsha)){
      if (dirha == 1) {
        Serial.println("smer 1");
        digitalWrite(X_DIR, LOW);
        digitalWrite(X_STEP, HIGH);
        delay(speedDelayha);                       
        digitalWrite(X_STEP, LOW);
        delay(speedDelayha);
            
      }
    
       if (dirha == 0){
        Serial.println("smer 0");
        digitalWrite(X_DIR, HIGH);
        digitalWrite(X_STEP, HIGH);
        delay(speedDelayha);                       
        digitalWrite(X_STEP, LOW);
        delay(speedDelayha);  
      }
  x++;
     }

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů