31
Na warsztacie / Odp: Drawinowo od nowa (rozmowy RT).
« dnia: 18 Sierpnia 2022, 13:32:21 »
Kiedy będą realizowane pozostałe nagrania? Mam kwestię w misji 13, nagrałbym już dziś, ale nie ma wszystkich danych.
Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.
bitWrite(doPC[9], 1, digitalRead(52));
Większość informacji i narzędzi znajdziesz w tym wątku.
Ja sobie zrobiłem jeszcze takie zestawienie.
Ale o jakie adresy Ci chodzi? Szukasz opisu bitów w ramkach komunikacyjnych doPC i zPC, czy coś innego masz na myśli?
Dziękuję za rzeczową odpowiedź. Natomiast jeśli ustawię wartość maksymalnego wychylenia w stosunku do maksymalnego wskazania na manometrze to wtedy wskazówka pokazuje bzdury.Patrząc na to co mam w kodzie testowym, gdy sobie ćwiczyłem zastosowanie tych silniczków to mam tak jak pisałem wcześniej:
Dlatego moje pytanie brzmi, czy maksymalna wartość w bitach, tudzież 255 dla zbiornika głównego to 1,6 Mpa czy raczej 0,8 Mpa według symulatora?Kod: [Zaznacz]motor3.setPosition(map(TankPress, 0, 1023, 0, 3318));
gdzie TankPress to wartość z exe, a konkretnie ciśnienie w zbiorniku głównym z obu bajtów 15 i 16, żeby mieć zakres 10 bitowy (do 1023).Kod: [Zaznacz]zPC_TankPress = zPC[15];
Jeśli chcesz na jednym bajcie to po prostu bierzesz sobie tylko bajt 15 i robisz mapowanie nie do 1023 tylko do 255.
zPC_TankPress1 = zPC[16];
TankPress = (zPC_TankPress << 0) | (zPC_TankPress1 << 8);
Odpowiadając na pytanie, to ciśnienie z exe chyba jest w barach i max czyli 255 (lub 1023) to jest max na skali manometru. Ja to sobie robiłem tak, że odpalałem ten program testujący od @maciek001. Tam ustawiam rozdzielczość, którą wykorzystuje (8 lub 10 bitów) i suwakiem od danego manometru szukam maksymalnej wartości wskazywanej na skali manometru. To oczywiście gdy w kodzie dla silnika jest pełen zakres i mapowanie wtedy jest 0, 1023, 0, 3780. Wtedy wychodzi, że maksymalne wskazanie nie jest oczywiście na końcu zakresu silniczka tylko wcześniej i ograniczam wtedy zakres pracy silniczka (liczbę kroków) tak aby mapowanie zakresu 0-1023 (lub jak wolisz 0-255) odpowiadało zakresowi kroków 0-X, gdzie X będzie maksymalną wartością na skali manometru (1,6 dla ZG lub 1,0 dla PG i CH) dlatego w moim przypadku zakres dla ZG to 0-3318 i takie mapowanie mam w finalnym kodzie. Oczywiście użyteczny zakres pracy musisz podać w eu07.ini w linii uarttune, gdzie podaje się wartości ciśnienia i odpowiadające im wartości przesyłane po UART. Dla 10 bitów i ZG powinno tam być 1.6 1023 (lub dla 8 bitów 1.6 255). To powoduje, że exe wysyła wartość z podanego w ini zakresu 0-1023 lub 0-255 i tę wartość wykorzystujesz w kodzie, żeby przemapować na kroki silniczka w zakresie od 0 do wartości odpowiadającej maksimum na skali. Po tym wszystkim bawiąc się suwaczkiem w programie diagnostycznym powinieneś mieć wskazania od 0 do maksimum skali. Zatem zakres tego co wysyła exe zależy od wpisu uarttune w eu07.exe.
Edit1: Policzyłem sobie jeszcze jak to wszystko działa i wyszło mi, że użyteczny kąt dla pełnych skali manometrów to około 276°. Jeśli użyjemy 10 bitów to wychodzi ok 0,3° na bit co daje 3 kroki na 1°. W związku z tym Używając tego specjalizowanego układu AX1201728SG i 10 bitów z exe to i tak wracamy do rozdzielczości podstawowej zamiast 12 kroków na 1°. Ten 1° na ok. 50 mm długości wskazówki daje prawie 0,9 mm na jej końcu. Przy pewnej bezwładności silniczka to raczej nie daje szans na płynne wskazania. Niby 1 bit powoduje przesunięcie liniowe ok 0,3 mm na końcu wskazówki i to powinno nie być bardzo widoczne jednak dane z exe zanim trafią do silnika to pewnie chwilę trwa i on nie wskazuje wartości co 1 bit tylko skokowo co kilka i stąd drgający ruch wskazówek. Muszę się jeszcze pobawić parametrami w bibliotece Switec i może to coś poprawi.
Edit2: Pobawiłem się jeszcze raz tymi silniczkami i zaktualizowałem swój opis na https://baur.pl/manometry-naped-alternatywny/ Może komuś się przyda.
bitWrite(doPC[4], 7, digitalRead(52));
if(digitalRead(52) == LOW)
{
bitWrite(doPC[4], 7, 1);
}
else{
bitWrite(doPC[4], 7, 0);
}
map jest po to, żeby dopasować wartość z exe (od 0 do 1023) do użytecznego zakresu wskazań na skali manometrów (od 0 do 3xxx zależnie od manometru).
motor1.setPosition(map(zPC[11], 0, 255, 0, 1890));
motor1.update();
Jakie potencjometry najlepiej wykorzystać do hamulców?Liniowe 10K
#include <SwitecX12.h>
const int STEPS = 315 * 12;
const int A_STEP = 8;
const int A_DIR = 9;
const int RESET = 10;
SwitecX12 motor1(STEPS, A_STEP, A_DIR);
void setup() {
digitalWrite(RESET, HIGH);
Serial.begin(9600);
motor1.zero();
motor1.setPosition(STEPS/2);
}
void loop() {
static bool forward = true;
static int position1 = STEPS * 3/4;
static int position2 = STEPS * 1/4;
if (motor1.stopped) {
motor1.setPosition(forward ? position1 : position2);
forward = !forward;
}
motor1.update();
}
volatile uint8_t zPC[52] = {0}; // standardowe bajty przekazywane do kodu Arduino
volatile uint8_t doPC[20] = {0xEF, 0xEF, 0xEF, 0xEF, 0}; // standardowe bajty przyjmowane z kodu Arduino
void setup() {
pinMode(2, OUTPUT); //ustawienie pinu 2 jako wyjście cyfrowe
pinMode(3, OUTPUT); //ustawienie pinu 3 jako wyjście cyfrowe
pinMode(9, OUTPUT); //ustawienie pinu 9 jako wyjście cyfrowe
digitalWrite(2, LOW); //ustawienie stanu niskiego na pinie 2
digitalWrite(3, LOW); //ustawienie stanu niskiego na pinie 3
digitalWrite(9, LOW); //ustawienie stanu niskiego na pinie 9
Serial.begin(115200); //nawiązanie komunikacji z prędkością 115200b/s
Serial.setTimeout(10);
while(!Serial){}; //czekanie do nawiązania komunikacji z komputerem
}
void loop() {
digitalWrite(2, (bitRead(zPC[8], 6))); //czuwak
digitalWrite(3, (bitRead(zPC[8], 7))); //shp
analogWrite(9, zPC[17]); //amperomierz 1
while (!Serial.available()) {};
Serial.readBytes((char*)zPC, 52);
Serial.write((char*)doPC, 20);
}
volatile uint8_t zPC[52] = {0}; // standardowe bajty przekazywane do kodu Arduino
volatile uint8_t doPC[20] = {0xEF, 0xEF, 0xEF, 0xEF, 0}; // standardowe bajty przyjmowane z kodu Arduino
void setup() {
pinMode(2, OUTPUT); //ustawienie pinu 2 jako wyjście cyfrowe
pinMode(3, OUTPUT); //ustawienie pinu 3 jako wyjście cyfrowe
pinMode(9, OUTPUT); //ustawienie pinu 9 jako wyjście cyfrowe
digitalWrite(2, LOW); //ustawienie stanu niskiego na pinie 2
digitalWrite(3, LOW); //ustawienie stanu niskiego na pinie 3
digitalWrite(9, LOW);
Serial.begin(115200); //nawiązanie komunikacji z prędkością 115200b/s
Serial.setTimeout(10);
while(!Serial){}; //czekanie do nawiązania komunikacji z komputerem
}
void loop() {
digitalWrite(2, (bitRead(zPC[8], 6))); //czuwak
digitalWrite(3, (bitRead(zPC[8], 7))); //shp
analogWrite(9, zPC[19]); //amperomierz 1
byte zPC[19] = {0};
while (!Serial.available()) {};
Serial.readBytes((char*)zPC, 52);
Serial.write((char*)doPC, 20);
}