Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:balancing-robot

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2018:balancing-robot [2019/01/13 23:32]
Daniel Hubík [5) Testování]
2018:balancing-robot [2019/01/14 22:02] (aktuální)
Daniel Hubík [4) MCU]
Řádek 157: Řádek 157:
  
 </​code>​ </​code>​
 +
 +
 +Seznam důležitých komponentů v Processor expertu:
 +  * LED - pro debugovací účely
 +  * UART - pro komunikaci mezi PC a deskou
 +  * Piny UP, DOWN, LEFT, RIGHT - vstupy z Arduina
 +  * Bit1 a Bit2 - směr H-můstku
 +
 +{{:​2018:​balancer:​components.png?​400|}}
 +
  
  
Řádek 184: Řádek 194:
 Komunikace mezi arduinem a CC1101: SPI Komunikace mezi arduinem a CC1101: SPI
  
-Komunikace mezi Arduiem a deskou: jednoduchý přenos bitů přez piny. +Komunikace mezi Arduiem a deskou: jednoduchý přenos bitů přes piny. 
  
  
Řádek 192: Řádek 202:
  
 ==== 5) Testování ====  ==== 5) Testování ==== 
-I když byl H-můstek napájen z 9V baterie (která je ve specifikaci),​ nastal problém a přestal po chvilce fungovat. Pravděpodobně se spálil i když nic nezapáchalo či bylo horké. Naštěstí byly k dispozici tyto H-můstky 2. Tento můstek byl připojen na nižší napětí, než je specifikováno (5V z Arduino desky) ​a řízení fungovalo (všechny směry a oba motory). Poté byly připojeny všechny desky mezi sebou, pouze KL25Z byla napájena z USB. Motory se spínaly v závislosti na natočení desky (bohužel nebylo ještě pořízno video) - větší úhel než 0° zapnut jeden směr, menší úhel než 0° zapnut druhý směr (zatím není implementovaná PWM). Napajení ​bylo ponecháno a byly odpojeny řídící piny můstku. Bylo provedeno nahrátí nového kódu do desky. Po připojení pinů můstku do vyvojové ​desky nenastal se nic nestalo. Pouze LED diody na KL25Z změnily jas a LED dioda na H můstku zhasla. Poslední můstek byl zničen. ​+I když byl H-můstek napájen z 9V baterie (která je ve specifikaci),​ nastal problém a přestal po chvilce fungovat. Pravděpodobně se spálil i když nic nezapáchalo či bylo horké. Naštěstí byly k dispozici tyto H-můstky 2. Tento můstek byl připojen na nižší napětí a řízení fungovalo (všechny směry a oba motory). Poté byly připojeny všechny desky mezi sebou, pouze KL25Z byla napájena z USB. Motory se spínaly v závislosti na natočení desky (bohužel nebylo ještě pořízno video) - větší úhel než 0° zapnut jeden směr, menší úhel než 0° zapnut druhý směr (zatím není implementovaná PWM). Napájení ​bylo ponecháno a byly odpojeny řídící piny můstku. Bylo provedeno nahrátí nového kódu do desky. Po připojení pinů můstku do vývojové ​desky přestal můstek fungovat. Pouze LED diody na KL25Z změnily jas a LED dioda na H můstku zhasla. Poslední můstek byl zničen. ​
  
-Poté jsme přikročili k další části práce- vlastní napájecí zdroj pro vozítko. Kde nastal další problém, který ​ zabral spoustu času. Po připojení 9V baterie na pin Vindeska nijak nereagovala. Na videu lze vidět průběh napájecího napětí při připojené desce a při odpojené. Když byla připojená,​ napětí pokleslo z 9V na 8.72V a zobrazil se průběh jaký je vidět na osciloskopu. Bohužel tento problém způsobil takové zpoždění,​ že projekt zůstal ve fázi testování.+Poté jsme přikročili k další části práce - vlastní napájecí zdroj pro vozítko. Kde nastal další problém, který ​ zabral spoustu času. Po připojení 9V baterie na pin Vin deska nijak nereagovala. Na videu lze vidět průběh napájecího napětí při připojené desce a při odpojené. Když byla připojená,​ napětí pokleslo z 9V na 8.72V a zobrazil se průběh jaký lze vidět na osciloskopu ​ve videu. Bohužel tento problém způsobil takové zpoždění,​ že projekt zůstal ve fázi testování.
    
 Testování:​ Testování:​
Řádek 203: Řádek 213:
  
 ---- ----
-====  ​Záver ​====  +====  ​Závěr ​====  
-Při tvorbě ​projektu ​nastaly chyby, které znemožnili vytvoření finálního verze a také videa zobrazující funkčnost. První problém nastal s H-můstkemkterý se spálil ​druhý problém nastal s napájením ​desky KL25ZI když jsme připojili 9V baterii na deskukterá podporuje maximálně 9V, deska nefungovalaPouze pokud bylo ivedeno napájení z USB. +projektu ​jsme získávali stabilizační parametry (z accelerometrumagnetometru ​gyroskopu) z přídavné ​desky pomocí komunikace I2CMezi deskami Arduina a CC1101 se používala komunikace SPI. Projekt byl tvořen ve vývojovém prostředí Codewarriorkde byl využit nástroj Processor ExpertDemonstrace funkčnosti úhlu natočení na šířce pulzu PWM lze pozorovat na iloženém videu. Šířka pulzu byla řízena PI regulátorem,​ jehož vstupem byly stabilizační parametry.
-Provedli jsme komunikaci pomocí sběrnic SPI a I2C+
  
-Byl pokus vytvořit vlastní H-můstek nejprve z diskrétnich tranzistorů BC337 a BC336, poté i s pomocí IGBT tranzistorů,​ ale nedostalo ​se funkčním vysledkům.  +Při tvorbě projektu nastaly chyby, které znemožnily vytvoření finální verze. První problém nastal s H-můstkem, který se pravděpodobně spálil a druhý problém nastal s napájením desky KL25Z. I když jsme připojili 9V baterii na desku, která podporuje maximálně 9V, deska nefungovala. Fungovala, pouze pokud bylo přivedeno napájení z USB. 
- +Byla snaha vytvořit vlastní H-můstek nejprve z diskrétnich tranzistorů BC337 a BC336, poté i s pomocí IGBT tranzistorů,​ ale nedosáhlo ​se funkčních vysledků. ​
-Na videu je demonstrace závislosti úhlu natočení na šířce PWM, která by se využila pro řízení motorů. Pokud je rozdíl úhlů velký, požadujeme dodání velké energie do motorů, aby chybu kompenzovali. +
- +
-Overkill docela.+
  
 Plán byl vytvořit celý model pomocí 3D tisku, ale na to nezbyl čas, kvůli událostem které nastaly při tvorbě projektu. ​ Plán byl vytvořit celý model pomocí 3D tisku, ale na to nezbyl čas, kvůli událostem které nastaly při tvorbě projektu. ​
- 
- 
  
 ---- ----
Řádek 229: Řádek 233:
  
 ====  Kód ====  ====  Kód ==== 
-Kod pro vysílač:​ +Kód pro vysílač:​ 
- +https://github.com/DanielHubik/MPOA/blob/master/arduino-cc1101-master/MPOA/Tx_strana/Tx_strana.ino/Tx_strana.ino.ino
-<​code>​ +
- +
- +
-<​code>​ +
-  #include <​Arduino.h>​ +
- #include <​cc1101.h>​ +
- #include <​ccpacket.h>​ +
- +
- // Attach CC1101 pins to their corresponding SPI pins +
- // Uno pins: +
- // CSN (SS) => 10 +
- // MOSI => 11 +
- // MISO => 12 +
- // SCK => 13 +
- // GD0 => A valid interrupt pin for your platform (defined below this) +
- +
- +
- #define CC1101Interrupt 0 // Pin 2 +
- #define CC1101_GDO0 2 +
- +
- +
- CC1101 radio; +
- +
- byte syncWord[2] = {199, 10}; +
- bool packetWaiting;​ +
- +
- unsigned long lastSend = 0; +
- unsigned int sendDelay = 20; +
- +
- void messageReceived() { +
-   packetWaiting = true; +
-+
- +
- void setup() { +
-   radio.init();​ +
-   radio.setSyncWord(syncWord);​ +
-   radio.setCarrierFreq(CFREQ_433);​ +
-   radio.disableAddressCheck();​ +
-   radio.setTxPowerAmp(PA_LongDistance);​ +
- +
-   Serial.begin(9600);​ +
-   Serial.print(F("​CC1101_PARTNUM ")); +
-   Serial.println(radio.readReg(CC1101_PARTNUM,​ CC1101_STATUS_REGISTER));​ +
-   Serial.print(F("​CC1101_VERSION ")); +
-   Serial.println(radio.readReg(CC1101_VERSION,​ CC1101_STATUS_REGISTER));​ +
-   Serial.print(F("​CC1101_MARCSTATE ")); +
-   Serial.println(radio.readReg(CC1101_MARCSTATE,​ CC1101_STATUS_REGISTER) & 0x1f); +
- +
-   Serial.println(F("​CC1101 radio initialized."​));​ +
- +
-   pinMode(5, INPUT_PULLUP);​ +
-   pinMode(7, INPUT_PULLUP);​ +
-   pinMode(8, INPUT_PULLUP);​ +
-   pinMode(9, INPUT_PULLUP);​ +
- +
- +
- +
-+
- +
- // Get signal strength indicator in dBm. +
- // See: http://​www.ti.com/lit/an/swra114d/swra114d.pdf +
- int rssi(char raw) { +
-   uint8_t rssi_dec; +
-   ​// TODO: This rssi_offset is dependent on baud and MHz; this is for 38.4kbps and 433 MHz. +
-   uint8_t rssi_offset = 74; +
-   rssi_dec = (uint8_t) raw; +
-   if (rssi_dec >= 128) +
- return ((int)( rssi_dec ​256) / 2) rssi_offset;​ +
-   else +
- return (rssi_dec ​2) - rssi_offset;​ +
-+
- +
- // Get link quality indicator. +
- int lqi(char raw) { +
-   return 0x3F - raw; +
-+
- +
- void loop() { +
- +
-   int Down = digitalRead(5);​ +
-   int Up = digitalRead(9);​ +
-   int Left = digitalRead(7);​ +
-   int Right = digitalRead(8);​ +
-   int Lock=0; +
-   unsigned long now = millis(); +
-   if (now > lastSend + sendDelay) { +
- char message[30];​ +
- char buffera[30];​ +
- lastSend = now; +
- Lock=0; +
- if (Up == LOW) { +
-   sprintf(message,"​UP"​);​ +
- } else if (Down == LOW) { +
-    ​sprintf(message,"​DOWN"​);​ +
- } else if (Left == LOW) { +
-    ​sprintf(message,"​LEFT"​);​ +
- } else if (Right == LOW) { +
-    ​sprintf(message,"​RIGHT"​);​ +
- } else { +
-   Lock=1; +
-+
- if (!Lock){ +
- CCPACKET packet; +
- // We also need to include the 0 byte at the end of the string +
- packet.length = strlen(message) ​ + 1; +
- strncpy((char *) packet.data, message, packet.length);​ +
- +
- radio.sendData(packet);​ +
- Serial.println(F("​Sent packet..."​));​ +
- Serial.println(message);​ +
-  +
-+
-   } +
-+
-  +
-</​code>​+
  
 Kód pro příjmač: Kód pro příjmač:
 +https://​github.com/​DanielHubik/​MPOA/​blob/​master/​arduino-cc1101-master/​MPOA/​Rx_strana/​Rx_strana.ino
  
-<​code>​ +Kód pro MCU (Codewarrior): 
-#include <​Arduino.h>​ +https://github.com/DanielHubik/MPOA
-#include <​cc1101.h>​ +
-#include <​ccpacket.h>​ +
- +
-// Attach CC1101 pins to their corresponding SPI pins +
-// Uno pins: +
-// CSN (SS=> 10 +
-// MOSI => 11 +
-// MISO => 12 +
-// SCK => 13 +
-// GD0 => A valid interrupt pin for your platform (defined below this) +
- +
- +
-#define CC1101Interrupt 0 // Pin 2 +
-#define CC1101_GDO0 2 +
- +
- +
-CC1101 radio; +
- +
-byte syncWord[2] = {199, 10}; +
-bool packetWaiting;​ +
- +
-unsigned long lastSend = 0; +
-unsigned int sendDelay = 200; +
- +
-void messageReceived() { +
-    packetWaiting = true; +
-+
- +
-void setup() { +
-    radio.init();​ +
-    radio.setSyncWord(syncWord);​ +
-    radio.setCarrierFreq(CFREQ_433);​ +
-    radio.disableAddressCheck();​ +
-    radio.setTxPowerAmp(PA_LongDistance);​ +
- +
-    Serial.begin(9600);​ +
-    Serial.print(F("​CC1101_PARTNUM ")); +
-    Serial.println(radio.readReg(CC1101_PARTNUM,​ CC1101_STATUS_REGISTER));​ +
-    Serial.print(F("​CC1101_VERSION ")); +
-    Serial.println(radio.readReg(CC1101_VERSION,​ CC1101_STATUS_REGISTER));​ +
-    Serial.print(F("​CC1101_MARCSTATE ")); +
-    Serial.println(radio.readReg(CC1101_MARCSTATE,​ CC1101_STATUS_REGISTER) & 0x1f); +
- +
-    Serial.println(F("​CC1101 radio initialized."​));​ +
-    attachInterrupt(CC1101Interrupt,​ messageReceived,​ FALLING); +
- ​pinMode(3,​ OUTPUT); +
- ​pinMode(4,​ OUTPUT); +
-     +
-+
- +
-// Get signal strength indicator in dBm. +
-// See: http://www.ti.com/lit/​an/​swra114d/​swra114d.pdf +
-int rssi(char raw) { +
-    uint8_t rssi_dec; +
-    // TODO: This rssi_offset is dependent on baud and MHz; this is for 38.4kbps and 433 MHz. +
-    uint8_t rssi_offset = 74; +
-    rssi_dec = (uint8_t) raw; +
-    if (rssi_dec >= 128) +
-        return ((int)( rssi_dec - 256) / 2) - rssi_offset;​ +
-    else +
-        return (rssi_dec / 2) - rssi_offset;​ +
-+
- +
-// Get link quality indicator. +
-int lqi(char raw) { +
-    return 0x3F - raw; +
-+
-void up(){ +
-  lastSend=millis();​ +
-    digitalWrite(3,​ HIGH); +
-+
-void down(){ +
-lastSend=millis();​ +
-  digitalWrite(4,​ HIGH); +
-+
-void loop() { +
-  unsigned long now = millis(); +
-  if (now > lastSend + sendDelay) { +
-digitalWrite(3,​ LOW); +
-digitalWrite(4,​ LOW); +
-  } +
-   +
-    if (packetWaiting) { +
-        detachInterrupt(CC1101Interrupt);​ +
-        packetWaiting = false; +
-        CCPACKET packet; +
-        if (radio.receiveData(&​packet) > 0) { +
-            if (!packet.crc_ok) { +
-                Serial.println(F("​crc not ok"​));​ +
-            } +
-             +
-            Serial.print(F("​rssi:​ ")); +
-            Serial.print(rssi(packet.rssi));​ +
-            Serial.print(F("​dBm ")); +
- +
-            if (packet.crc_ok && packet.length > 0) { +
-                Serial.println((const char *) packet.data);​ +
-            } +
-            if(strcmp((const char *) packet.data,"​UP"​)){ +
-            up(); +
-            } +
-            if(strcmp((const char *) packet.data,"​DOWN"​)){ +
-            down(); +
-            } +
-            } +
-         +
- +
-        attachInterrupt(CC1101Interrupt,​ messageReceived,​ FALLING); +
-    } +
-+
-</code>+
 ---- ----
2018/balancing-robot.1547418768.txt.gz · Poslední úprava: 2019/01/13 23:32 autor: Daniel Hubík