• 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
Sterowanie wieloma przekaźnikami, kombinacje
#1
Witam. Przymierzam się do budowy pewnego urządzenia gdzie zachodzi potrzeba obsługi 11 przekaźników. Każdy przekaźnik załącza określoną cewkę - indukcyjność. Pierwszy dołącza cewkę 4nH, a ostatni 40uH. Każda kolejna indukcyjność jest zdublowaniem poprzedniej (mniej więcej), tj. 40nH, 80nH, 160nH, 320nH, 640nH, 1,28uH........10,24uH, 20,48uH i ostatnia cewka ok 40uH. Dokładne wielkości nie są aż tak istotne. Istotne jest to, że chciałbym aby Arduino sterowało przekaźnikami tak, aby wynikową indukcyjność dało się  ustawić np. za pomocą encodera obrotowego ze skokiem co 40nH. 
Czyli jeśli zadamy np. 2,68uH, arduino załączy przekaźniki:
Przekaźnik nr 7 - cewka 2,56uH
Przekaźnik nr 2 - cewka 0,08uH (8nH)
Przekaźnik nr 1 - cewka 0,04uH (4nH)
Suma daje 2,68uH
Mówiąc krótko kombinacja załączeń 11 przekaźników daje możliwość uzyskania indukcyjności całości układu od 0nH do 80,88uH ze skokiem co 4nH. 80uH nie jest mi potrzenbne więc można zakończyć na 40uH. Daje nam to dokładnie 1000 pozycji (40 / 0,04). 
Czy istnieje możliwość realizacji takiego zadania w prosty sposób ?
Powiedzmy encoderem ustawiamy wartość od 0 do 40000nH (skok +/- 40), będzie to widoczne na LCD i dla każdej wartości definiujemy określoną kombinację z 11. Jak to zrobić? 
Oczywiście dostępna ilość pinów jest tu nie istotna bo użyję expandera.
Pozdrawiam. Robert
Robert, sp8sn
 
Odpowiedź
#2
Jeśli ktoś kiedyś wymyśli system dwójkowy i informatykę to pewnie tak się będzie wtedy zapisywało liczby w bitach bajtu czy dwóch.
 
Odpowiedź
#3
Doszedłem. Raczej bardziej prosta matematyka niż programowanie.
Poniżej szkic. Przyciskami 7 dół, 8 góra zmieniamy nastawę, a na monitorze seriala można zaobserwować wynik.
Dzięki, pozdrawiam.
https://drive.google.com/file/d/1JzqXwxa...sp=sharing
Robert, sp8sn
 
Odpowiedź
#4
Matematycy zawsze wbijają ten gwóźdź do końca. Pewnie jakiś zwykły (leniwy) informatyk by napisał to jeszcze krócej:
Kod:
uint16_t nastawa; //0000 0000 0000 0000 liczba 16bit by pomiescic 11 przekaznikow
uint8_t bity=11;

void setup() {
for (int i=2; i<bity+2;i++)
{
 pinMode(i,OUTPUT); //piny 2,3,4,5,6,7,8,9,10,11,12 ustawiamy jako wyjścia, tak by 0 i 1 od UARTA nie ruszac
}
Serial.begin(115200);
}

void loop() {
 
if (nastawa++>=2047) nastawa=0;
Serial.print("Aktualna nastawa: ");
Serial.print(nastawa);
Serial.print(", a w bitach: ");
Serial.print(nastawa,2);
Serial.print(", co odpowiada wartosci: ");
Serial.print(nastawa*40);
Serial.println("H");
Serial.println("Stan pinow, od lewej pin2: ");
for(int i=0;i<bity;i++) //ustawianie pinów
{
 boolean jakisbit=bitRead(nastawa,i);
 digitalWrite(bity+1-i,jakisbit);
 
 Serial.print(digitalRead(i+2));
 Serial.print(",");
}
Serial.println();
delay(10);
//można też zatrzymać po wydrukowaniu wszystkiego:
if(nastawa>=2047) while(1);
}
Ale najważniejsze, że działa.
 
Odpowiedź
#5
(28-10-2018, 17:55)tatoswinka napisał(a): Doszedłem. Raczej bardziej prosta matematyka niż programowanie.
Poniżej szkic. Przyciskami 7 dół, 8 góra zmieniamy nastawę, a na monitorze seriala można zaobserwować wynik.
Dzięki, pozdrawiam.
https://drive.google.com/file/d/1JzqXwxa...sp=sharing
Dlaczego kodu nie udostępniłeś na forum?
 
Odpowiedź
#6
przepraszam, dałem tylko linka
Kod:
//#include <Wire.h>
//#include "PCF8574.h";
//PCF8574 expander1;
//PCF8574 expander2;

long L;
long Lnastawa = 0;
int L1stan;
int L2stan;
int L3stan;
int L4stan;
int L5stan;
int L6stan;
int L7stan;
int L8stan;
int L9stan;
int L10stan;
int L11stan;

void setup() {
  Serial.begin(9600);
/*
expander1.begin(0x20);
expander1.pinMode(0, OUTPUT); // 40nH
expander1.pinMode(1, OUTPUT); // 80nH
expander1.pinMode(2, OUTPUT); // 160nH
expander1.pinMode(3, OUTPUT); // 320nH
expander1.pinMode(4, OUTPUT); // 640nH
expander1.pinMode(5, OUTPUT); // 1280nH
expander1.pinMode(6, OUTPUT); // 2560nH
expander1.pinMode(7, OUTPUT); // 5120nH
expander2.begin(0x20);
expander2.pinMode(0, OUTPUT); // 10240nH
expander2.pinMode(1, OUTPUT); // 20480nH
expander2.pinMode(2, OUTPUT); // 40960nH
expander2.pinMode(3, OUTPUT); // Cin 560pF
expander2.pinMode(4, OUTPUT); // Cin 1,2nF
expander2.pinMode(5, OUTPUT); // Cout 560pF
expander2.pinMode(6, OUTPUT); // Cout 1,2nF
expander2.pinMode(7, OUTPUT); // Cin var
*/
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
}

void loop() {
if (Lnastawa > 0 && digitalRead(7) == LOW){
  Lnastawa = Lnastawa - 40;
  wybornastaw();
}
if (Lnastawa <= 40960 && digitalRead(8) == LOW){
  Lnastawa = Lnastawa + 40;
  wybornastaw();
}
}

void wybornastaw(){
  L = Lnastawa;
if (L >= 40960){
  L = L - 40960;
  L11stan = 1;
}
else
{
  L11stan = 0;
}
if (L >= 20480){
  L = L - 20480;
  L10stan = 1;
}
else
{
  L10stan = 0;
}
if (L >= 10240){
  L = L - 10240;
  L9stan = 1;
}
else
{
  L9stan = 0;
}
if (L >= 5120){
  L = L - 5120;
  L8stan = 1;
}
else
{
  L8stan = 0;
}
  if (L >= 2560){
  L = L - 2560;
  L7stan = 1;
}
else
{
  L7stan = 0;
}
   if (L >= 1280){
  L = L - 1280;
  L6stan = 1;
}
else
{
  L6stan = 0;
}
   if (L >= 640){
  L = L - 640;
  L5stan = 1;
}
else
{
  L5stan = 0;
}
    if (L >= 320){
  L = L - 320;
  L4stan = 1;
}
else
{
  L4stan = 0;
}
    if (L >= 160){
  L = L - 160;
  L3stan = 1;
}
else
{
  L3stan = 0;
}
  if (L >= 80){
  L = L - 80;
  L2stan = 1;
}
else
{
  L2stan = 0;
}
   if (L >= 40){
  L = L - 40;
  L1stan = 1;
}
else
{
  L1stan = 0;
}

if (L==0){
  nastaw();
}
}

void nastaw(){
  Serial.print("Indukcyjnosc zadana = ");
  Serial.print(Lnastawa);
  Serial.println(" nH");
  Serial.print("stan L1 40nH     = ");
  Serial.println(L1stan);
  Serial.print("stan L2 80nH     = ");
  Serial.println(L2stan);
  Serial.print("stan L3 160nH    = ");
  Serial.println(L3stan);
  Serial.print("stan L4 320nH    = ");
  Serial.println(L4stan);
  Serial.print("stan L5 640nH    = ");
  Serial.println(L5stan);
  Serial.print("stan L6 1280nH   = ");
  Serial.println(L6stan);
  Serial.print("stan L7 2560nH   = ");
  Serial.println(L7stan);
  Serial.print("stan L8 5120nH   = ");
  Serial.println(L8stan);
  Serial.print("stan L9 10240nH  = ");
  Serial.println(L9stan);
Robert, sp8sn
 
Odpowiedź
#7
(29-10-2018, 10:17)tatoswinka napisał(a): przepraszam, dałem tylko linka

Ale wygenerowałeś tego kodu.
Kod:
expander1.pinMode(xxx, OUTPUT);
mogłeś dać w pętli. Swoją drogą co robi ta funkcja, skoro w PCF8574 nie ustawia się kierunku transmisji. Podglądałeś bibliotekę? Może wcale nie trzeba tej funkcji wywoływać. Podobnie w pętli powinno być
Kod:
 Serial.print("stan L9 10240nH  = ");
 Serial.println(L9stan);
Dwie małe zmiany i program będzie bardziej zrozumiały i krótszy.
Funkcja "wybornastaw" też woła o pomstę do nieba.
 
Odpowiedź
#8
Cytat:Funkcja "wybornastaw" też woła o pomstę do nieba.
zdaję sobie sprawę, ale zrobiłem jak umiałem i działa.
Z expanderm pewnie masz rację, tylko wyjścia - trzeba jeszcze sprawdzić bo gdzieś mam przed oczami kod właśnie z określeniem pinu.
Pisałem to tak na szybko jak pojawił się pomysł. Pewnie można sporo poskracać.
Robert, sp8sn
 
Odpowiedź
#9
Działa, ok odniosłeś sukces. Będzie on większy, jak kod zoptymalizujesz. Bez tego, będziesz takim programistom jak ci od Windows i do zamigania diodą będziesz potrzebował GHz i TB a miganie nie będzie równomierne.
 
Odpowiedź
#10
Niestety moja wiedza nie pozwala mi, przynajmniej na tę chwilę, zoptymalizować sekcji "wybornastaw"
Robert, sp8sn
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości