Mega a 20 serv

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Uživatelský avatar
gilhad
Příspěvky: 851
Registrován: 07 bře 2018, 11:22

Re: Mega a 20 serv

Příspěvek od gilhad » 05 říj 2023, 13:31

I2C: když tak dej kód, jak ti zatím funguje, ale je to celkem jednoduché

Já to mám nějak takhle

Kód: Vybrat vše

#define DS1307_I2C_ADDRESS 0x68   // to mi ukazal example "scanner"
// zapis 4 hodnot: 0, tmp1, tmp2, tmp3
		Wire.beginTransmission(DS1307_I2C_ADDRESS);
		Wire.write(0); // set next input to start at the seconds register
		Wire.write(tmp1);
		Wire.write(tmp2);
		Wire.write(tmp3);
		Wire.endTransmission();
// cteni 3 hodnot z registru 0,1,2
	Wire.beginTransmission(DS1307_I2C_ADDRESS);
	Wire.write(0x00); // set DS1307 register pointer to 00h
	Wire.endTransmission();
	Wire.requestFrom(DS1307_I2C_ADDRESS, 3);
	tmp1 = Wire.read();
	tmp2 = Wire.read();
	tmp3 = Wire.read();

#define PCF8563_I2C_ADDRESS 0x51
// zapis 4 hodnot: 0, tmp1, tmp2, tmp3
		Wire.beginTransmission(PCF8563_I2C_ADDRESS);
		Wire.write(0); // set next input to start at the seconds register
		Wire.write(tmp1);
		Wire.write(tmp2);
		Wire.write(tmp3);
		Wire.endTransmission();
// cteni 3 hodnot z registru 0,1,2
	Wire.beginTransmission(PCF8563_I2C_ADDRESS);
	Wire.write(0x00); // set DS1307 register pointer to 00h
	Wire.endTransmission();
	Wire.requestFrom(PCF8563_I2C_ADDRESS, 3);
	tmp1 = Wire.read();
	tmp2 = Wire.read();
	tmp3 = Wire.read();

// a klidne pouzivam oboji na stridacku

Prostě v tom uvodním jen nastavím jinou hodnotu, které zařízení na I2C sběrnici to má chtít

Zapojené to je paralelně. Tu adresa na sběrnici tam máš určitě "nějak" zadanou už teď, jinak by se to nedomluvilo ani s každým zvlášť.
Adresa se použije i pokud máš připojenou jen jednu věc. Ta věc nezkoumá, kdo na sběrnici kdy je či není, vždycky prostě reaguje jen na svojí adresu. (Teda až na broadcasty, ale ty teď stejně neřešíš.)
Pravda je, že spousta knihoven tu adresu má schovanou nějak uvnitř, ale pak prostě tu knihovnu "normálně používáš" a ona tak nějak "všechno sama" a víc různých knihoven vesele spolupravuje.

luger
Příspěvky: 248
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 05 říj 2023, 16:30

díky gilhad, ale stejně tomu nerozumím
používám knihovny "MPU6050.h" pro gyroskop, "U8glib.h" pro oled displej a "Wire.h" a taky "I2Cdev.h".
Nikde nezadávám adresu.

Inicializace displeje:
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE);

Inicializace gyroskopu:
void setup() {
Wire.begin();
Serial.begin(9600);
accelgyro.initialize();
.
.
adresy jsem zjistil 60 a 104

luger
Příspěvky: 248
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 05 říj 2023, 17:46

už to funguje, měl jsem tam chybu v programu. Není potřeba zadávat žádnou adresu, spolupracuje to i bez nich, asi si to nějak zjistí knihovna. Docela mě udivuje jak je to pomalé. Zjištění polohy gyroskopu a vypsání na oled trvá asi 0,2 s.

luger
Příspěvky: 248
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 05 říj 2023, 18:09

foto výstupu na oled
vzd - vzdálenost z ultrazvuku, foto, zvuk a PIR ještě nejsou zapojené takže nějaká hamlatilka, XYZ - výstup z gyroskopu
Přílohy
IMG_20231005_175328_695.jpg

Uživatelský avatar
gilhad
Příspěvky: 851
Registrován: 07 bře 2018, 11:22

Re: Mega a 20 serv

Příspěvek od gilhad » 05 říj 2023, 21:12

I2C je samo o sobě docela rychlé, ale často jsou pomalá ta zařízení na něm.
Obzvláště teda OLED.
Něco mají na svědomí knihovny a Arduino styl, něco samotná zařízení, něco přenášená data pro obrazovku (spousta pixelů) a něco i to, že se čeká místo paralelního zpracování.

Když nikde nezadáváš adresu, tak si to knihovny nějak řeší samy a nemusíš se o to starat :D Prostě používej knihovny.


(I2C protokol je často rozkreslený v různých datasheetech, ale princip je jednoduchý - Arduino po drátech pošle adresu zařízení (povině), případně data, která chce zapsat a zařízení případně pošle data Arduinu.
A pak zase znova a znova to celé dokola.
Každé zařízení reaguje jen na věci začínající jedho adresou (kterou má většinou nějak zadrátovanou uvnitř).
Takže knihovny většinou ví, jakou adresu a jak to konkrétně udělat, takže ven poskytují věci už zpracované.
)

Uživatelský avatar
kiRRow
Příspěvky: 1315
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Mega a 20 serv

Příspěvek od kiRRow » 06 říj 2023, 11:13

Z hlediska principu funkce I2C je vždy nutno volat adresu zařízení. Pokud knihovně tuto adresu nesdělíš, sama tam doplní defaultní adresu. Problém ti třeba nastane, když budeš mít dvě stejné I2C zařízení a jednomu tu adresu předrátuješ. Pak už budeš muset té knihovně sdělit, že nesmí používat defaultní adresu, ale musíš ji zadat. Nevýhoda arduina a knihoven - spousta věcí se děje mimo a je skrytá, aby se případný nováček nevyděsil.

luger
Příspěvky: 248
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 06 říj 2023, 19:11

Prozatím to tak nechám. Když to funguje ....
Ale mám jiný problém. Dorazil mi servoboard (vlastně dva různé typy). Prozatím jsem je připojil na zdroj (7,5 V) jen na napájení a měřím.
Jeden ukazuje na výstupu pro serva 7,5 V a druhý 2,3 V. Tak nevím jestli je to vpořádku. Nemělo by tam být 5 V ?

Zapojení:
Přílohy
servoboard.jpg

Uživatelský avatar
gilhad
Příspěvky: 851
Registrován: 07 bře 2018, 11:22

Re: Mega a 20 serv

Příspěvek od gilhad » 06 říj 2023, 21:05

Já bych čekal, že pro každé servo tam bude zem, napájecí napští a PWM (které řiká, kam to servo má být natočené). Ale to možná taky bude chtít nějaké minimální nastavení (dát všem servům natočení doprostřed, nebo tak nějak), kdoví, jak to ty servoboardy mají (asi jejich dokumentace :) ).

Je klidně možné, že jeden board defaultně nastaví serva do minimální hodnoty a druhý třeba do střední a třetí do maximální (nebo náhodné). A taky je otázka, jak to napětí měříš, ono to PWM bývá docela rychlé a laciný měřák to nějak kdoví jak zprůměruje.

bum
Příspěvky: 22
Registrován: 01 úno 2023, 12:16
Bydliště: Ústecký kraj
Kontaktovat uživatele:

Re: Mega a 20 serv

Příspěvek od bum » 06 říj 2023, 21:35

Napětí serv je zde trvale 6V podle jejich typu, sice některá serva mají napájení 7V což zde určitě použita podle popisu k servo boardu nejsou, v popisu je uvedený typ serv ale jde o digitální serva v tom případě by však cena stavebnice se 16-ti servy byla úplně jiná. PWM pouze ovládá natáčení poloh serv žádná složitost, počáteční nastavení serv po zapnutí napájení je dáno programově.

luger
Příspěvky: 248
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 07 říj 2023, 10:39

Chybama se člověk učí , odpálil jsem pár serv a jeden servoboard. Takže se to pokusím shrnout:
- servoboardy které používám (viz předchozí nákres zapojení) se napájí - pro CPU - 5,0-8,5 V (sám si to stabilizuje na potřebné napětí 5,0V) a výkonové napětí pro samotné serva, které může být v rozsahu 4,2 - 7,2 V. Toto napětí musí odpovídat napětí na které je servo stavěné !! jinak je odpálíte jako já.
Zkušený kolega "bum" mi poradil snížení napětí pomocí diod řazených sériově. Na každé je úbytek asi 0,6-0,8 V takže při napětí 8,4 V z baterek jsem jich musel zařadit 4 ks abych dosáhl napětí 5,9 V. Problém bude s úbytkem napětí. Jakmile se sníží napětí baterek na cca 7V tak diody toto napětí sníží na cca 4,5 V. Lepší bude step-down měnič který se nastaví na třeba 5,5 V a pak ho drží.
Teˇje v plánu testování serv.
Jednoduchý prográmek hýbe servem tam a zpět s určitou prodlevou. Ověřím si tím funkčnost serv a zjistím jejich krajní polohy (změnou parametu P):

Kód: Vybrat vše

#include <SoftwareSerial.h>
SoftwareSerial SoftSerial(14, 15);  // RX, TX
#include "Wire.h"

void setup() {
  Serial.begin(9600);
  SoftSerial.begin(9600);
delay(500);

}

void loop() {
 SoftSerial.print("#8P1400T400\r\n");
delay(1500);
 SoftSerial.print("#8P1700T400\r\n");
delay(1500);

}

Odpovědět

Kdo je online

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