HomeMade

Pełna wersja: Arduino
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Dokładnie to
Po dogłębnej analizie opisu programowania poprzez złącze ISP opisanej tutaj: http://www.open-electronics.org/arduino-...-circuits/, oraz wbrew opinii Kolegów, wcześniejszych dyskutantów tego wątku, doszedłem jednak do wniosku że oddzielny programator do kompilatora Arduino jednak jest mi niezbędny. Niestety, nie ma jeszcze w ofercie oddzielnego modułu programatora, chociaż są już poszczególne fragmenty konstrukcyjne, jednak zaprojektowane dla mnie w sposób nieakceptowalny do moich wymagań. Dlatego też na bazie Arduino Duemilanowe narysowałem schemat i wzór płytki drukowanej, a jako że to prototyp, wykonałem go z elementami przewlekanymi. Moje PROGDUINO tak naprawdę jest bardzo zubożonym Arduino, tylko z niezbędnymi wyjściami na złącze programujące, które uwzględniają uwagi zawarte w opisie przytoczonym powyżej. Drobne zmiany dotyczą podłączenia pinu RESET złącza ISP do pinu 16 (SS) procesora PROGDUINO i wyłączeniu go z płytki jak w oryginale Arduino, natomiast do złącza RESET, pin 1 procesora PROGDUINO, tu jako programatora wpięty jest dodatkowo kondensator 10 uH, zgodnie z sugestiami autora opisu jw. Jako procesor wstawiłem Atmegę 168 z wgranym na stałe programem ArduinoISP, dołączonym do kompilatora Arduino.
Moje PROGDUINO zainstalowało się bez najmniejszych problemów na kolejnym porcie COM komputera i widoczne jest z poziomu kompilatora. Dokładny opis postępowania podczas programowania z wykorzystaniem złącza ISP jest podany we wskazanym na wstępie linku i nie ma potrzeby powtarzać go ponownie, jest zbyt obszerny w treści.
Do pełni szczęścia jest jeszcze wykorzystywana wcześniej opracowana płytka z wieloma podstawkami pod różne procesory z rodziny Atmega, te najczęściej wykorzystywane. Płytka spinana jest z PRODGUINO złączem ISP, a pokazana była w poście #11 z tego tematu.
Co mi to dało:
- nie muszę budować po raz kolejny pajęczyny przewodów na płycie prototypowej gdy chcę zaprogramować kolejny procesor,
- nie muszę wymieniać procesora jeśli programowałem go na płycie bazowej Arduino,
- oszczędzam cenny czas o którym wspominają Koledzy,
- i jeszcze wiele innych zalet …...o których pewnie jeszcze nawet nie śniłem.
W załącznikach schemat w pliku .PNG i wzór płytki prototypowej w pliku .LAY. Całość udostępniona na zasadach Home-Made i w zgodzie z filozofią Open Hardware.
Rysio!
Rysio!
Te kultowe LEDy :-)
Super, faktycznie nie ma sensu plątać się za każdym razem z kablami. Przy najbliższej okazji idzie do trawienia.

MAc
mrn
Programator do procesorów AVR możemy zrobić jeszcze taniej bez układu FT232RL. Taniutka ATmega8 plus soft potrafi obsługiwać bezpośrednio USB na potrzeby programatora. Polecam wykonanie programatora USBasp.

http://www.fischl.de/usbasp/
(15-07-2013 14:47)SP6IFN napisał(a): [ -> ]W załącznikach schemat w pliku .PNG i wzór płytki prototypowej w pliku .LAY. Całość udostępniona na zasadach Home-Made i w zgodzie z filozofią Open Hardware.
Rysio!

Zgadzam się z potrzebą posiadania zewnętrznego programatora.
Też mam taki. Tylko moja płytka kończy się typowym złączem KANDA (10 stykowe), do którego dołączam taśmę. Wymienne taśmy pozwalają na programowanie układów wyposażonych w różne gniazda (10-stykowe, 6-stykowe) i bezpośrednie podłączenie kabelków.
Dzisiaj Łukasz wrzucił nową wersję biblioteki do APRS. Pojawiło się pare nowych metod użycia dzięki czemu zzabawa jest bardziej elastyczna:

Kod:
#include <Arduino.h>
#include <ArduinoQAPRS.h>

char * packet_buffer  = "                                                                    \n ";


void setup(){
    // inicjalizacja
    // pin 3 to sensePin [wejscie] - 1 oznacza brak mozliwosci nadawania
    // pin 2 to txPin [wyjscie] - stan wyski w momencie rozpoczecia nadawania
    QAPRS.init(3,2,"SQ5RWU", '0', "APZQAP", '0', "WIDE1-1");
}

void loop() {
        // nadanie paketu typu komentarz
        packet_buffer = ":TEST TEST TEST de SQ5RWU";
        // zmiana adresu źródłowego i ssida
        QAPRS.setFromAddress("SQ5R", '1');
        QAPRS.sendData(packet_buffer);
        // nadanie pakietu z pozycja i symbolem wahadlowca
        packet_buffer = "!5215.68N/02057.48ES#";
        // zmiana adresu źródłowego, ssida i ścieżki
        QAPRS.setFromAddress("SQ5RWU", '2');
        QAPRS.setRelays("WIDE2-2");
        QAPRS.sendData(packet_buffer);
        // nadanie danych pogodowych bez pozycji
        packet_buffer = "_07071805c025s009g008t030r000p000P000h00b10218";
        // zmiana ścieżki
        QAPRS.setRelays("WIDE1-1");
        QAPRS.sendData(packet_buffer);
        delay(5000);
}

Ja nieco poprawiłem swoją płytkę do testowania tej biblioteki i napisałem w arduino prosty program by się tym bawić.

Kod:
/*
    Copyright Rysiek Labus SQ9MDD
APRS Platform na bazie arduino i QAPRS.

APRS Platform is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

APRS Platform is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with ArduinoQAPRS; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


APRS Platform jest wolnym oprogramowaniem; możesz go rozprowadzać dalej
i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU,
wydanej przez Fundację Wolnego Oprogramowania - według wersji 2 tej
Licencji lub (według twojego wyboru) którejś z późniejszych wersji.

Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
ZASTOSOWAŃ. W celu uzyskania bliższych informacji sięgnij do
Powszechnej Licencji Publicznej GNU.

Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 59 Temple
Place, Fifth Floor, Boston, MA  02110-1301  USA

Changelog

2013.07.16 Stabilna wersja 1.0 obsługa wysyłania bikonu, zapis konfiguracji
do eepromu.

*/
#include <EEPROM.h>
#include <Arduino.h>
#include "ArduinoQAPRS.h"

#define version 1.0;

//zmienne, nie dotykac
char from_addr[] = "NOLIC ";              //znak
char * relays = "                    ";   //20 znaków
char * comment_arr = "                                                             ";//bufor na ramkę 60 znaków 19 na koordynaty symboj i tablice.
char * packet_buffer  = "                                                                    \n ";
int volt_indic = 0;                       //czy pokazac napięcie?
int ssid = 0;                             //domyślne SSID
int beacon_interwal = 1;                  //domyślny czas wysyłania beaconu w minutach
int napiecie_zasilania_pin = A3;
String content = "";
unsigned long time_to_beacon = millis() + (beacon_interwal*60000); //domyślnie co minute i co minute blokujemy na dole

//zapis zmiennych do eepromu
void save_to_eeprom(){
  EEPROM.write(0,1);                     //zaznaczamy ze zapisana jest pamiec
  EEPROM.write(1,volt_indic);            //zaznaczamy wyswietlanie napiecia
  EEPROM.write(2,ssid);                  //zapisujemy ssid
  EEPROM.write(3,beacon_interwal);       //zapisujemy co ile wysylamy beacon  
  //zapis callsign do eeprom 6 znaków
  for(int a = 4; a <= 9; a++){
    EEPROM.write((a),from_addr[a-4]);
  }
  //zapis path 20 znaków
  for(int b = 10; b <= 29; b++){
    EEPROM.write((b),relays[b-10]);
  }
  //zapis komentarz 60 znaków
  for(int c = 30; c <= 90; c++){
    EEPROM.write((c),comment_arr[c-30]);
  }
}

//odczytanie zmiennych z eepromu i  wczytanie do zmiennch lokalnych albo ustawienie domyślne
void read_from_eeprom_or_make_default(){
  int skonfigurowany = EEPROM.read(0);
  if(skonfigurowany == 1){
    volt_indic = EEPROM.read(1);
    ssid = EEPROM.read(2);
    beacon_interwal = EEPROM.read(3);
    //odczyt callsign z eeprom
    for(int a = 4; a <= 9; a++){
      from_addr[a-4] = EEPROM.read(a);
    }
    //odczyt sciezki
    for(int b = 10; b <= 29; b++){
      relays[b-10] = EEPROM.read(b);    
    }    
    //odczyt kometarz koordynaty symbol i tabela z eeprom'u
    for(int c = 30; c <= 90; c++){
      comment_arr[c-30] = EEPROM.read(c);    
    }  
  }
  else{
    relays = "WIDE1 0";
    comment_arr = ">EMPTY EEPROM";
  }
}

void clear_eeprom_memory(){
  for(int a = 0; a < 512; a++){
    EEPROM.write(a,0xFF);
    delay(10);
  }
}

//reset jakby trzeba było sprawdzić konfigurację, no i po czyszczeniu eeproma sie przydaje
void softReset(){
  asm volatile ("  jmp 0");
}

//przygotowujemy dane i wysyłamy ramkę
void prepare_and_send_beacon_f(){
  int napiecie_zasilania = map(analogRead(napiecie_zasilania_pin),0,1023,0,15​9);
  int v_prefix = napiecie_zasilania/10;
  int v_sufix = napiecie_zasilania%10;
  if(volt_indic==1){
    sprintf(packet_buffer,"%s %02u.%01uV",comment_arr,v_prefix,v_sufix);
  }
  if(volt_indic==0){
    sprintf(packet_buffer,"%s",comment_arr);
  }
  QAPRS.send(from_addr, ssid, "APZMDD", '0', relays, packet_buffer);
}

//mala pomoc jesli ktoś nie ma aplikacji
void print_help(){
  Serial.println("APRS Platform based on Arduino and QAPRS library.\ncommands:");
  Serial.println("mca=     callsign");
  Serial.println("mti=     beacon timing (m)");
  Serial.println("mpa=     path");
  Serial.println("mra=     beacon text including symbol, table and coordinates");
  Serial.println("mpv=     voltage in beacon");
  Serial.println("send     sending beacon");
  Serial.println("cls      clearing eeprom memory");
  Serial.println("mem      writing current config to memory");
  Serial.println("reset    reload device");
  Serial.println("help,?   printing this manual");
}

//obowiązkowo setupik na starcie
void setup(){
  pinMode(napiecie_zasilania_pin,INPUT);
  QAPRS.init(0,0);
  Serial.begin(9600);
  read_from_eeprom_or_make_default();
}

//petla główna
void loop() {
  unsigned long time = millis();
  //słuchamy eresa
  while(Serial.available()) {
    char character = Serial.read();
    content.concat(character);
    delay (10);
  }
  if (content != "") {
    content.trim();//wywalamy CR i LF z wchodzących stringów
    time_to_beacon = time + (beacon_interwal*60000);
    //zmiana znaku
    if(content.substring(0,4) == "mca="){
      content.substring(4).toCharArray(from_addr,7)​;
      int by_position = content.indexOf('-')+1;    
      ssid = content.substring(by_position).toInt();
    }
    if(content.substring(0,4) == "mti="){
      beacon_interwal = content.substring(4).toInt();
      //Serial.print(a);
    }
    if(content.substring(0,4) == "mpa="){
      content = content.substring(4);      
      int dlugosc = content.length()+1;
      content.toCharArray(relays,dlugosc);      
    }
    if(content.substring(0,4) == "mpv="){
      if(content.substring(4) == "1"){
        volt_indic = 1;
      }
      if(content.substring(4) == "0"){
        volt_indic = 0;
      }
    }
    if(content.substring(0,4) == "mra="){
      content = content.substring(4);
      int dlugosc = content.length()+1;
      content.toCharArray(comment_arr,dlugosc);      
    }  
    if(content.substring(0,4) == "send"){
      prepare_and_send_beacon_f();
    }
    if(content.substring(0,3) == "cls"){
      clear_eeprom_memory();  
    }  
    if(content.substring(0,3) == "mem"){
      save_to_eeprom();  
    }
    if(content.substring(0,5) == "reset"){
      softReset();  
    }
    if(content.substring(0,4) == "help"){
      print_help();
    }
    if(content.substring(0,1) == "?"){
      print_help();
    }    
    content = "";
  }  
  //jesli ramka co minute to nie wysylamy nic takie zabezpieczenie jesli konfig nie wgrany
  if (time >= time_to_beacon && beacon_interwal!= 1){
    prepare_and_send_beacon_f();
    time_to_beacon = time + (beacon_interwal*60000);
  }
}

Kod jest do uporządkowania, piszę w arduino dopiero trzeci tydzień.
Do tego napisałem aplikację na pc w lazarusie do konfiguracji płytki...
Ogólnie trzeba jeszcze sporo nad tym popracować, Smile jak ktoś ma ochotę to zapraszam do zabawy.
Co do książki Spraw by rzeczy przemówiły ... i arduino książka jest bardzo fajna lecz niestety moim zdaniem mało przydatna dla krótkofalowca gdyż skupia się w dużej mierze na obsłudze sieci -współpracy z internetem (co mi się bardzo podoba), języku procesing ale nie na rzeczach interesujących dla zaczynających zabawę z procesorami i pragnących wykonać np., sterownik syntezy czy jakiś układ przydatny w pracy krótkofalarskiej.
W zasadzie doszedłem do podobnego wniosku co Rafał. Miałem w ręku przejrzałem i jednak zdecydowałem że nie kupię i będę eksperymentował z pomocą internetu Wink
Drugą książką polskojęzyczną poświęcono Arduino jest: Inteligentny dom Automatyzacja mieszkania za pomocą platformy Arduino systemu Android i zwykłego komputera. Opinia taka sama jak powyżej.
Dwa ciekawe linki :
http://wiring.org.co/learning/basics/index.html
http://hacknmod.com/hack/top-40-arduino-...f-the-web/
Ryśku z jakiegoś podręcznika do lazarusa korzystasz czy z netu, w sumie to obiektowy pascal czyli coś bez problemu powinno się dać znaleźć.
Co do książki o arduino to mogę z czystym sercem polecić może niedokładnie o arduino ale niezwykle pomocną szczególnie dla początkujących
Języki C i C++. Twój pierwszy program no i wręcz kultowa pozycja
Język ANSI C autorzy K&R
Stron: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Przekierowanie