Sida 7 av 11

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 4 maj 2014, 21:02:36
av Spisblinkaren
Här har ni implementeringen av segment A (högst upp). Har alltså byggt 7 olika sådana.

Gjorde först en komplicerad implementering som involverade ett gäng 16:1-muxar men kunde inte fitta designen i CPLDn.

Så jag gjorde om alla segmentkodningar enligt nedan.

Fick dock fortfarande problem. Men genom att flytta en signal till ett annat funktionsblock fick jag plats med designen.

Ren tur mao :)

Alla signaler är f.ö placerade vid typ varannan pinne för att på så sätt nyttja resurserna så mycket som möjligt. Visade sig nämligen att ben bredvid varandra tillhör samma funktionsblock och dessa vill man belasta så lite som möjligt.

Nåväl, till slut lyckades jag skapa en *.jed-fil som är den fil man "bränner" CPLDn med.

Jag har bestämt mig för att bygga in fyra BCD-omkopplare för att testa "bussniff"-funktionen också.

MVH/Roger
PS
CPLDn jag har tillgång till heter nåt med XCR3128XL och har hela 144 pinnar ;)

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 8 maj 2014, 22:10:13
av Spisblinkaren
Nu har jag designat min 66-pinnars DIL CPLD.

Den har 63 I/Os som man i praktiken kan nyttja till vad som helst.

Min DIL CPLD kan således inte bara användas till detta bygge utan allmänt kan man programmera den till nåt praktiskt taget godtyckligt kombinatoriskt/sekvensiellt. Ett utvecklings-kit mao :)

Jag bygger alltså in själva debug-kontakten också, sen är det bara att plugga i JTAG-adaptern och programmera.

Eventuellt kommer jag realisera alla mina 32 instruktioner för min CPU mha av samma modul. Detta dels för att det känns så surt att frekvensen är begränsad till 4MHz pga mina gamla EPROM dels för att utvecklingsarbetet som det är nu är komplicerat rent programmeringsmässigt.

Nästa steg är att lära sig PADS för att CADda fram en layout.

Önska mig lycka till :)

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 8 maj 2014, 23:21:27
av Spisblinkaren
Såhär ser den fräschaste planen ut.

CPLD-modulen/vaggan går bort pga onödigt många virningar (jobbigt att kapa och skala virtråd :))

Istället kommer det viras direkt till DIL-modulen.

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 18 maj 2014, 00:39:02
av Spisblinkaren
Efter mycket om och men bestämde jag mig för att vira ihop ett gäng HC164 skiftregister istället.

Jag har samtidigt gjort utrymme för min CPLD-modul. Dess pinnar har dock inte virats än då jag avser få skiftregistrena att fungera först. Som ni ser har jag även skippat inverterarna så iom att jag har CA-LEDs så kommer jag behöva skifta 0-or för att tända segmenten.

Jag har skissat på ett UNO-program för detta och det blev faktiskt inte så krångligt som jag trodde.

Först ska jag alltså få UNO att fungera med dessa skiftregister, sen ska jag plugga i min 68P CPLD-modul och helt enkelt bara lyfta ur HC-kapslarna. Men förmodligen kommer detta dröja i tid om det ens blir av. Hänger på om jag bestämmer mig för att installera Eagle eller ej.

Nästa steg är förresten att bygga själva moderkortet. Iom att virhylslisterna blev fel (komponentbens-hål) så kommer jag först plugga i vanliga hylslister (stiftlist-hål) innan jag kan plugga i modulerna i moderkortet.

Bifogar bilder.

MVH/Roger
PS
Ser nu att jag virat ALLA segment-signaler till fel sida. Jag är en hopplös idiot när det gäller höger/vänster & uppochner. Jag blir så förbannad!

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 19 maj 2014, 23:35:31
av Spisblinkaren
Det här projektet blev helt galet.

Borde nog byta signatur :D

Nåväl, såhär ser det ut just nu. I morgon ska jag köpa ett gäng hylslister för att fysiskt kunna montera ihop modulerna. Det blev ju fel redan från början (vir-hylslisterna svalde inte stift-lister och dessutom kostade dom skjortan).

Nu är status tom så komiskt att jag sent omsider (tack vare EF) bestämde mig för att bara nyttja skiftregister (HC164) och skippa "problematiken" med knölig programmering och att det är 0-or som styr mitt CA-display.

Pga av detta enklare förfarande fick jag plats med min hysteriska DIL CPLD på samma modul. Dvs modul-byte behövs nu inte. Alltså faller hela grejen med moduler :D

Jag blir ofta förvånad över hur man kan vara så korkad som jag är ibland :)

MVH/Roger
PS
Bilden är arrangerad.

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 20 maj 2014, 20:40:10
av Spisblinkaren
Nu har jag monterat ihop modulerna mha hylslister.

Jag var dock tvungen att använda hammare för att få i hylslisterna :D

Satte CLR-ingången (som plötsligt blev min LT dvs Lamp Test) aktiv.

Slog på spänningen.

Alla segment utom f2 tändes.

Felsökte.

En virpinne hade hamnat snett :D

Slog på spänningen igen.

Resultatet ser ni nedan :)

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 21 maj 2014, 22:22:20
av Spisblinkaren
Nu har jag gjort en ashäftig video som demonstrerar att min LED-drivare verkligen fungerar.

Mycket nöje!



MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 22 maj 2014, 00:20:43
av Magnus_K
Snyggt! Bra jobbat!

Förresten, kan hammare och sned virpinne ha något med varandra att göra? :wink:

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 22 maj 2014, 15:03:52
av Spisblinkaren
Tack!

Du har nog rätt i det men 3 av 4 gick att hamra utan problem.

Fast det är klart, med hammare tigger man ju om problem :)

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 4 juni 2014, 20:22:09
av Spisblinkaren
Jag har nu kopplat in LED-drivaren till UNO och gjort ett basalt test där jag klockar in ettor för släckning och nollor för tändning.

Bifogar video.



MVH/Roger
PS
Nu återstår "bara" att generera dom tecken jag är intresserad av (0-F).

Sen väntar emellertid också loggning till SD vilket jag inte har en susning om hur jag ska göra :D

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 26 augusti 2014, 22:31:40
av Spisblinkaren

Kod: Markera allt

void clockPulse(){
  digitalWrite(9, LOW);
  delayMicroseconds(10);
  digitalWrite(9, HIGH);
  delayMicroseconds(10);
}

void getDigit (int value){
  int primA, primB, primC, primD, A, B, C, D;
  primA=(value / 1000);// value=0-1023=ABCD
  primB=(value / 100);
  primC=(value / 10);
  primD=value;
  A=(primA % 10);
  B=(primB % 10);
  C=(primC % 10);
  D=(primD % 10);
  ABCD[0]=D;
  ABCD[1]=C;
  ABCD[2]=B;
  ABCD[3]=A;
}
  

void decode (int digit) {
  switch (digit){
  case 0:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=1;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 1:
  seg[0]=1;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=1;//f
  seg[6]=1;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 2:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=1;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=1;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 3:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=1;//e
  seg[5]=1;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 4:
  seg[0]=1;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 5:
  seg[0]=0;//a
  seg[1]=1;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=1;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 6:
  seg[0]=0;//a
  seg[1]=1;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 7:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=1;//f
  seg[6]=1;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 8:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 9:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  }
}

void tmpDisplay (void){
  for (int i=8; i--; i>0){
  if (seg[i] == 0) out = LOW;
  else out = HIGH;
  digitalWrite(8, out); // writes one segment at the time
  clockPulse();  
  }
}
Ovanstående funkar faktiskt :)

Speciellt intressant map på den sista funktionen. Ser ni varför? :D

Bifogar video.

MVH/Roger


Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 19 september 2014, 20:54:27
av Spisblinkaren
Jag har nu börjat studera logger-shielden (LS) eftersom jag fått koden till det övriga systemet att fungera.

LS ser mycket enkel ut men jag misstänker att det kommer krävas ett mirakel om jag ska kunna få den biten att fungera.

Idag printade jag ut Adafruit's 63-sidiga manual för LS och avser studera den vid tillfälle.

Jag har också uppdaterat min kod med en abstraktionsfunktion (storeToSD) som jag inte har en susning om hur jag ska lyckas implementera.

Men i övrigt fungerar LED och dylikt nu som det ska.

LS placeras alltså ovanpå UNO mha stiftlist. Innanför stiftlisterna finns sedan via-hål för ditlödning av hylslist varvid jag kommer kunna få exakt samma HW-gränssnitt som jag har nu även med LS monterad.

Frågan är nu bara om jag kan trycka i knappcellsbatteriet för realtidsklockan (RTC) och trycka dit LS innan jag skrivit klart programvaran. Låter nästan som en löjlig fråga så det blir retoriskt ja på den :)

Här kommer förresten all min kod:

Kod: Markera allt

/*
Poll
 */
 
//int servo=13;
//int PotValue;

// the setup routine runs once when you press reset:
void setup() {                
// initialize the digital pin as an output.
  pinMode(13, OUTPUT); //output for Servo/debugging
  pinMode(6, OUTPUT); //green LED for Cal
  pinMode(7, OUTPUT); //red LED for memoryFull
  pinMode(8, OUTPUT); //SDO for shift register
  pinMode(9, OUTPUT); //CLK for shift register
// initialize the digital pin as an input.
// Pin 2&3 are connected to a button tied to GND with pullup 10K to VCC.
  pinMode(2, INPUT); //input for newUser button 
  pinMode(3, INPUT); //input for Cal button
}

int temp;
int tempCal; //temporary calibration variable
int tempMaxForce; //used to track maxForce
int servoVar; //used for debugging
int sensor_stat;
int sensor_dyn;
int holdTime_stat;
int holdTime_dyn;
int newUser_stat;
int newUser_dyn;
int cal_stat;
int cal_dyn;

int strengthArray[500]; //array for converted samples (RAM=2kB, 1 value=10bit~2B)
int seg[8];
int ABCD[4];
char out;

int j=0; //sample counter init
int maxForce=0; //initiates maximum force to 0kg
int peakHold=0; //initiates peakHold to zero seconds.

//These three functions has been used for servo debugging.
int analogConvert(int Analog) {
  return 500 + 2 * Analog;
}

int digitalConvert(int Digital) {
  return 500 + 2048 * Digital;
}

void runServo(int width) {
  digitalWrite(13, LOW);
  delay(1);
  digitalWrite(13, HIGH);
  delayMicroseconds(width);
  digitalWrite(13, LOW);
  delay(19);
}

int actualForce(int Sample) {
  return Sample; //may scale 0-1023 optionally.
}

void memoryFull(int state) {
  if (state==1)
  digitalWrite(7, HIGH); //green@debug
  if (state==0)
  digitalWrite(7, LOW);
}

void highBlink() { //._.___
  digitalWrite(6, HIGH);
  delay(3);
  digitalWrite(6, LOW);
  delay(3);
  digitalWrite(6, HIGH);
  delay(3);
  digitalWrite(6, LOW);
}

void lowBlink() { //.___
  digitalWrite(6, HIGH);
  delay(10);
  digitalWrite(6, LOW);
  delay(1000);
  digitalWrite(6, HIGH);
  delay(10);
  digitalWrite(6, LOW);
}

void calBlink() { //ON
  digitalWrite(6, HIGH);
}

void clockPulse(){
  digitalWrite(9, LOW);
  delayMicroseconds(10);
  digitalWrite(9, HIGH);
  delayMicroseconds(10);
}

int inv (int biten){
  if (biten == 0)
  return 1;
  else
  return 0;
}

void getDigit (int value){
  int primA, primB, primC, primD, A, B, C, D;
  primA=(value / 1000);// value=0-1023=ABCD
  primB=(value / 100);
  primC=(value / 10);
  primD=value;
  A=(primA % 10);
  B=(primB % 10);
  C=(primC % 10);
  D=(primD % 10);
  ABCD[0]=D;
  ABCD[1]=C;
  ABCD[2]=B;
  ABCD[3]=A;
}
  

void decode (int digit) {
  switch (digit){
  case 0:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=1;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 1:
  seg[0]=1;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=1;//f
  seg[6]=1;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 2:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=1;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=1;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 3:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=1;//e
  seg[5]=1;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 4:
  seg[0]=1;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 5:
  seg[0]=0;//a
  seg[1]=1;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=1;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 6:
  seg[0]=0;//a
  seg[1]=1;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 7:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=1;//f
  seg[6]=1;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 8:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=0;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  case 9:
  seg[0]=0;//a
  seg[1]=0;//b
  seg[2]=0;//c
  seg[3]=1;//d
  seg[4]=1;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP, may be replaced by a variable
  break;
  }
}

void tmpDisplay (void){
  for (int i=7; i>=0; i--){
  if (seg[i] == 0) out = LOW;
  else out = HIGH;
  digitalWrite(8, out); // writes one segment at the time for each digit
  clockPulse();  
  }
}
  

// displays value on LED
void displayTmp(int value){ 
    getDigit(value);
    decode(ABCD[0]); //decodes D
    tmpDisplay(); //sends it
    decode(ABCD[1]); //decodes C
    tmpDisplay(); //sends it
    decode(ABCD[2]);
    tmpDisplay();
    decode(ABCD[3]);
    tmpDisplay();
}
    
// sensor value is somehow stored to SD
void storeSensor(int* value){
  temp=value[1]; //dummy
}

// sensor value needs to be time stamped and not an array like above
void storeToSD (int value) {
  temp=value; //dummy
}

// holdTime<3s
void holdTime(int value){
  peakHold=value*3;
}

// newUser enables new data sequence input
void newUser(){ 
  j=0; //resets sample counter 
  maxForce=0; //resets maxForce
  memoryFull(0); //turns off red LED 
}

// Cal calibrates sensor to actual reference force (5kg)
void Cal(){              
  tempCal=analogRead(0);//put 5kg of force before pressing Cal button
  while ((tempCal>5) || (tempCal<5)) { //tune as closely as you can
    if (tempCal>5) highBlink();//blinks green LED ._.___
    if (tempCal<5) lowBlink();//blinks green LED .___
    delay(500);//tune pot on sensor
    tempCal=analogRead(0);
  }
  calBlink();//turns green LED on
  j=0; //resets sample counter 
  maxForce=0; //resets maxForce
  memoryFull(0); //turns off red LED
}

/*
void initLED (void){ //sends FFFF to display
  seg[0]=0;//a
  seg[1]=1;//b
  seg[2]=1;//c
  seg[3]=1;//d
  seg[4]=0;//e
  seg[5]=0;//f
  seg[6]=0;//g
  seg[7]=1;//DP
  tmpDisplay();
  tmpDisplay();  
  tmpDisplay();
  tmpDisplay(); 
}
initLED();
*/

void loop () {
  sensor_stat=analogRead(0);
  holdTime_stat=analogRead(1);
  newUser_stat=digitalRead(2);
  cal_stat=digitalRead(3);
// delays 50ms to await any knob changes
  delay(50); 
// abs neccesary due to sampling accuracy. 
  holdTime_dyn=analogRead(1);
  if (abs(holdTime_dyn-holdTime_stat)>2){
    holdTime(holdTime_dyn);// sets holdTime
  }
  newUser_dyn=digitalRead(2);
  if (newUser_dyn != newUser_stat){
    newUser();//resets sample counter, memoryFull LED and maxForce 
  }
  cal_dyn=digitalRead(3);
  if (cal_dyn != cal_stat){
    Cal();
  }
 // abs neccesary due to sampling accuracy.  
  sensor_dyn=analogRead(0);
  if (abs(sensor_dyn-sensor_stat)>2){
    tempMaxForce=actualForce(sensor_dyn);
    if (tempMaxForce>maxForce){
      maxForce=tempMaxForce; 
      displayTmp(maxForce); //sends maxForce to display only if new maxForce
      storeToSD(maxForce);
      delay(peakHold); //holds maxForce
    }
    maxForce=analogRead(0); //actually reads new value
    displayTmp(maxForce); //sends current value to display
    storeToSD(maxForce);
    }
}
  
 
Bifogar även ett litet kollage.

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 23 september 2014, 20:26:48
av Spisblinkaren
Så här ser Arduino UNO ut med Adafruit Data Logger Shield (sköld) påmonterad.

Konstigt nog ökade instabiliteten i systemet när jag monterade på skölden.

Givarvärdena var inte alltid stabila utan kunde flukturera i bl.a hundratalspositionen.

Samtidigt förändrades Reset till att innebära visning av precis alla segment inklusive DP.

För att detta överhudtaget ska kunna ske så måste ett pulståg (CLK) på minst 32 flanker skickas till LED-kortet samtidigt som Data-pinnen hålls låg.

Till kråksången hör att när jag, innan jag monterade skölden, tryckte på Reset så hände aldrig nåt med visningen (som sig bör).

Men nu förstår jag ingenting annat än att jag kanske måste konfigurera skölden först för samma resultat(?)

För speciellt fluktuationerna kan omöjligen ha att göra med avvikelser i A/D-omvandlingen.

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 21 november 2014, 23:32:30
av Spisblinkaren
Har beslutat köpa en ny processor till mitt UNO-projekt (kostnad: endast 40:- på Kjell&Co)

Felen jag mäter är nämligen så skumma att de måste ha med ESD-skadad(?) processor att göra.

Som exempel kan nämnas att när man BARA mäter på CLK ändrar UNO beteende.

Utan "belastande" (läs 1M Ohm...) prob genereras enbart 8:or i LED vid reset-tryck dvs datat är idel 0:or samtidigt som minst 32 klockpulser (CLK) genereras.

Med prob på CLK-pinnen fås emellertid tämligen jämt 0:or på LED. Detta är stokastiskt omöjligt då varje siffra (skilt från 8 eller släckt) innebär en unik sekvensiell kod.

Slutligen ska inte LED kunna påverkas alls av RESET då alla I/Os endast utsätts av max en flank (vanligtvis HIGH-to-LOW).

Jag är således så rådlös att jag åtminstone måste prova ny processor.

Speciellt ur den synvinkeln att innan jag monterade logger-shielden (LS) så funkade allt tämligen perfekt.

Det bör tilläggas att jag även provat utan LS för att få tillbaks ordinarie beteende men det gick inte det heller.

Jag har också provat att pulla ner CLK men utan framgång.

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 22 november 2014, 19:36:52
av nifelheim
passa på att beställa några "snik kloner" också, alltid bra att ha och testa med om man misstänker hårdvarufel.
http://www.ebay.com/itm/2014-NEW-ATmega ... 1521676277?

34:- inkl frakt.

Dom har en virtuell COMport's adapter så du kan inte programmera om användningen av USB porten,
som du kan göra på en "riktig" UNO.