1

Temat: arduino i openwrt

bawił się tu ktoś takim połączeniem?

mam zamiar podłączyć (ale najpierw zbudować) matryce diodową do DockStara. taką RGB 8x8 na początek
troche pogooglowałem i doszedłem do  wniosku, ze najprościej bedzie wykożystać płytke arduino i cztery 74HC595 (8 bit shift register).
co sądzicie? moze jakoś prościej to mozna rozwiazac? tylko bez wylutowywania diód, zeby zwolnić GPIO (dwie linie to chyba za mało) big_smile

2

Odp: arduino i openwrt

http://openwrt.pl/doku.php/zastosowania:arduino

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3 (edytowany przez patryk 2011-02-17 01:57:12)

Odp: arduino i openwrt

jak możnazatrzymać wykonywanie skryptu (ash, bash, tcsh... obojętnie) na mniej niz sekubdę?
oczywiście w openwrt

narazie zrobiłem sobie taką prowizorke w php:

#!/usr/bin/php-cli
<?php
usleep($argv[1] * 1000000);
?>

ale z dokładnością to jest różnie
jest do tego jakas natywna funkcja?

4

Odp: arduino i openwrt

Nie. Sleep działa z dokładnością sekundy. Możesz zrobisz pętle która coś tam będzie liczyła i zajmie jej to mniej niź sekundę. Tyle że to nie jest system czasu rzeczywistego, więc działanie czegoś w tle może tą niecałą sekundę wydłużyć.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: arduino i openwrt

Najprościej to wykorzystać gotowe matryce diodowe 8x8 oraz sterownik MAX 7219 od Maxima. Wówczas stosje się 1 taki sterownik na matryce. Robiłem niedawno takie połączenie i działa doskonale. Do tego skrypcik w bash i u mamy monitor obciążenia routera smile

Zabawa z rejestrami przesuwnymi jest czasami męcząca smile

Pozdrawiam, Artur
http://digi-led.pl/blog - Blog

6 (edytowany przez patryk 2011-02-17 22:10:49)

Odp: arduino i openwrt

dziś rano to samo wygooglowałem wink
trzy maxy połączone kaskadowo + matryca rgb
czekam na części z ebay big_smile

pewnie będzie mi migała matryca, bo multiplexing bedzie 3 razy wolniejszy niz na jednym kolorze no ale to nie temat na to forum big_smile
pozyjemy - zobaczymy wink

7

Odp: arduino i openwrt

...pożyłem, zobaczyłem.... big_smile
mam już matryce (dwa kolory - czerwony i zielony + taki dziwny pomarańczowy po zmieszaniu) i klona arduino mega
udało mi się nawet napisać programik, ale jak narazie bez przewijania tekstu big_smile

zdezydowanie bardziej mi sie podoba matryca diodowa niz wyświetlacz lcd big_smile

jakby ktoś szukał programiku do bezpośredniego sterowania matrycą (znaczy bez dodatkowych scalaków - samo arduino), to proszę.
ale ostrzegam. jest jeszcze troche kulawy big_smile
sterowanie przez serial działa. wszystko jest opisane po angielsku - zainteresowani sobie na bank poradzą big_smile

/*
this program lets u to controll 8x8 bi color LED matrix (direct drive).
i'm using it to display email notifications, network stats etc.
arduino mega is connected to DockStar with OpenWrt no board.
it's cool addision for speach notificatins :D
just change pins to match your matrix and have fun ;)
*/
int pins[25]= {-1, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23};

int red[8] = {pins[23], pins[20], pins[17], pins[14], pins[2], pins[5], pins[8], pins[11]};
int green[8] = {pins[24], pins[21], pins[18], pins[15], pins[1], pins[4], pins[7], pins[10],};
int cols[8] = {pins[22], pins[19], pins[16], pins[13], pins[3], pins[6], pins[9], pins[12]};

void setup() {
  Serial.begin(9600);
  for (int i = 1; i <= 24; i++) {
    pinMode(pins[i], OUTPUT);
  }
}

int input;
int nowReadCol;
int nowReadRow;

int pattern[8][8] = { \
  {1, 1, 1, 1, 1, 1, 1, 1}, \
  {1, 2, 2, 2, 2, 2, 1, 1}, \
  {1, 2, 1, 1, 1, 1, 2, 1}, \
  {1, 2, 1, 1, 1, 1, 2, 1}, \
  {1, 2, 2, 2, 2, 2, 1, 1}, \
  {1, 2, 1, 1, 1, 1, 1, 1}, \
  {1, 2, 1, 1, 1, 1, 1, 1}, \
  {1, 1, 1, 1, 1, 1, 1, 1}
};

void loop() {
  show(pattern);
  inputS();  
}

void inputS() {
  //defined serial commands
  //we have 3 colors : red, greenand kinda-yellow
  //(r, g, y) and 0 as off
  //to change image on your matrix u have to define a line (A-H)and colors
  //so for example if u want to set 3rd line to Y-Y-G-G-R-R-OFF-OFF,
  //send 'Cyyggrr00'
  //if u wish to change only one pixel use something like 'D---r----'
  //'-' means "don't touch this LED" :D
  //send 'x' to turn off entire matrix
  //send 'N' to swap red and green LEDs
  if (Serial.available() > 0) {
    int input = Serial.read();
    switch (input) {
      case 'x':               //turn off entire natrix
        clean();
        break;
      case 'N':               //swap red with green pixels (entire matrix) 
        negative();
        break;
      case 'A':               //define row/collumn (depending on point of view :D )
        nowReadCol = 0;       // A-F => 1-8
        nowReadRow = 0;
        break;
      case 'B':    
        nowReadCol = 1;
        nowReadRow = 0;
        break;
      case 'C':    
        nowReadCol = 2;
        nowReadRow = 0;
        break;
      case 'D':    
        nowReadCol = 3;
        nowReadRow = 0;
        break;
      case 'E':    
        nowReadCol = 4;
        nowReadRow = 0;
        break;
      case 'F':    
        nowReadCol = 5;
        nowReadRow = 0;
        break;
      case 'G':    
        nowReadCol = 6;
        nowReadRow = 0;
        break;
      case 'H':    
        nowReadCol = 7;
        nowReadRow = 0;
        break;
      case 'r':                                //turn on red
        pattern[nowReadCol][nowReadRow] = 1;
        nowReadRow++;
        break;
      case 'g':                                //turn on green
        pattern[nowReadCol][nowReadRow] = 2;
        nowReadRow++;
        break;
      case 'y':                                //turn on yellow (red + green)
        pattern[nowReadCol][nowReadRow] = 3;
        nowReadRow++;
        break;
      case '0':                                //turn off
        pattern[nowReadCol][nowReadRow] = 0;
        nowReadRow++;
        break;
      case '-':                                //leave bit as is
        nowReadRow++;
        break;
    }
  }
}

void clean() {
  for (int kolumna = 0; kolumna < 8; kolumna++) {
    for (int wiersz = 0; wiersz < 8; wiersz++) {
      pattern[kolumna][wiersz] = 0;
    }
  }
}

void negative() {
  for (int kolumna = 0; kolumna < 8; kolumna++) {
    for (int wiersz = 0; wiersz < 8; wiersz++) {
      if (pattern[kolumna][wiersz] == 1) {
        pattern[kolumna][wiersz] = 2;
      }else{
        if (pattern[kolumna][wiersz] == 2) {
          pattern[kolumna][wiersz] = 1;
        }
      }
    }
  }
}

void show(int pattern[8][8]) {
  for (int kolumna = 0; kolumna < 8; kolumna++) { //dla każdej kolumny
    for (int wiersz = 0; wiersz < 8; wiersz++) {
      if (pattern[kolumna][wiersz] == 1) {
        digitalWrite(red[wiersz], LOW);
        digitalWrite(green[wiersz], HIGH);
      }
      if (pattern[kolumna][wiersz] == 2) {
        digitalWrite(green[wiersz], LOW);
        digitalWrite(red[wiersz], HIGH);
      }
      if (pattern[kolumna][wiersz] == 3) {
        digitalWrite(green[wiersz], LOW);
        digitalWrite(red[wiersz], LOW);
      }
      if (pattern[kolumna][wiersz] == 0) {
        digitalWrite(green[wiersz], HIGH);
        digitalWrite(red[wiersz], HIGH);
      }
    }
    digitalWrite(cols[kolumna], HIGH);
    delay(1);
    digitalWrite(cols[kolumna], LOW);
  }
}