• 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
Pomoc z działaniem projektu
#11
Wrzucam kod:
https://paste.ofcode.org/VKKdbgaExeS4R26nimb4A9
NIestety czas mam do dziś także jeśli chciałby ktoś pomóc za opłata to zapraszam na wiadomość prywatną.
 
Odpowiedź
#12
Nie rozumiem w czym masz problem?? Przecież silnik się kręci a wyświetlacz wyświetla..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#13
Z tym, że chciałbym zrównoleglić program, bo wyświetlacz wyświetla ale po zakończeniu obrotu silnika. Są to małe odstępy czasu ale projekt wymaga tego, żeby działo się to równolegle. Udalo mi sie zastąpic funkcję delay() funkcjami micros(); ale wtedy jest problem z wyświetlaniem, posługiwałem się takim fragmentem kodu, czego funkcję while platają mi figlę a gdy wstawie coś w ich ciało silnik ogranicza prędkość obrotów
void loop() {
for (int s = 0; s < steps; s++){
time_a = micros();
digitalWrite(7, HIGH);
digitalWrite(7, LOW);
while(micros() - time_a < 3000){

}
time_b = micros();
digitalWrite(7, LOW);
while(micros() - time_b < 2000){

// do nothing
}
}

while(1);
}
 
Odpowiedź
#14
a czemu nie zrobisz tego na timerze? już nie mówię sprzętowe PWM ale niech choć macha pinem na przerwaniu. Jakie to ardunio jaka atmega??


Przykład dla atmegi 2560 i 328p

Kod:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "HX711.h"
#define DOUT  3 //pin do którego podłączone jest złącze DT
#define CLK  2 //pin do którego podłączone jest złącze SCK
HX711 scale(DOUT, CLK);
float calibration_factor = -860.0; //korekta pomiarowa
LiquidCrystal_I2C lcd(0x27,16,4);  //określenie adresu wyświetlacza i jego wielkość

#define StepPin 7


ISR(TIMER1_COMPA_vect) {
  digitalWrite(StepPin, digitalRead(StepPin) ^ 1);
}

void setup() {
  pinMode(8,OUTPUT);       //krokowy DIR
  pinMode(StepPin,OUTPUT);       //krokowy STEP
  pinMode(6,OUTPUT);       //krokowy EN
  digitalWrite(8,HIGH);
  digitalWrite(6,LOW);

//////////////// Timer 2,5ms 400Hz bo taki miałeś delay 5ms dwie zmiany, zmiana co 2,5ms
  noInterrupts();
  // Clear registers
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 624;   // 400 Hz (16000000/((624+1)*64))
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS11) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  interrupts();

///////////////


lcd.init(); //uruchamiamy wyświetlacz
lcd.backlight(); //uruchamiamy podświetlenie wyświetlacza
scale.set_scale(calibration_factor); //Ustawienie kalibracji
  scale.tare();         
}

void loop() {

  lcd.clear();//wyczyszczenie wyświetlacza
  lcd.setCursor(0,0);//ustawienie kursora
  lcd.print("Sila adhezji=");
   lcd.setCursor(0,1);
  scale.set_scale(calibration_factor); //Zastosowanie korekty pomiarowej
   Serial.print("Odczyt: ");
   Serial.print(scale.get_units(), 1);    //scale.get_units() zwraca zmienną float
  Serial.print(" N");                   //Dowolnie możemy wybrać kilogramy lub funty, lecz przy zmianie zmienia się również współczynnik kalibracji
  Serial.println();
  lcd.print(scale.get_units(), 1);
  lcd.setCursor(4,1);
  lcd.print("N");
 
 
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#15
Jest to arduino uno r3, na timerze to znaczy?
 
Odpowiedź
#16
To wyżej będzie działać... Timer to znaczy sprzętowe przerywanie. I to wyżej macha pinem na przerwaniu, wiec silnik działa niezależnie od programu wyświetlacza nawet gdybyś wstawił jakieś tam "delay" to silnik będzie kręcił po prostu czasami blokuje wyświetlacz (ale to dosłownie z 10 taktów zegara) by wykonała sie zmiana na pinie gdzie tego nawet nie zauważysz...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#17
Bardzo dziękuje,jestem mega wdzięczny, jedynym mankamentem było to , to że na wyświetlacz odświeża sie z bardzo duża częstotliowścią i nie wczytuje wartości funkcji : scale.get_units(). Po usunięciu lcd.clear, już tą wartość udało się uzyskać, jeszcze jedno pytanie, jak zwolnić nadpisywanie wartości siły adhezji na wyświetlaczu? Rozumiem, że odbywa się w to w tym fragmencie kodu:
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 624; // 400 Hz (16000000/((624+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
 
Odpowiedź
#18
Nie tutaj

  lcd.setCursor(0,0);//ustawienie kursora
  lcd.print("Sila adhezji=");

Po prostu daj delaya. Albo millis jak umiesz... 


Teraz twój problem polega na tym że LCD dostał kopa i nic go nie blokuje... Dlatego wyświetlacz szwankuje bo dane są bardzo szybko aktualizowane. A wcześniej niż zdążyło się wyświetlić to nastąpiło czyszczenie lcd.. 

po drugie ja tego nie rozumiem skoro to jest miernik jakiejś siły oderwania/przerwania to nie lepiej liczyć kroki odległości? i najwyższy Nm??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości