Interfacciare Hard-Disk IDE con Arduino?

Sezione dedicata ai Microcontrollori e ai Sistemi Embedded

Interfacciare Hard-Disk IDE con Arduino?

Postby impulso_magnetico » 16 Aug 2012, 15:28

Salve a tutti, sono un nuovo iscritto e mi sono poco fa presentato nei nuovi.

a casa mi ritrovo molti HD usati smontati da vecchi PC ma ancora funzionanti con l'interfaccia IDE, quella parallela, e avevo intenzione di usarli per sperimentarci qualcosa.
leggendo in giro in forum sugli atmel ho visto che qualcuno afferma di poter interfacciare e gestire questi HD con l'arduino....

secondo voi è una cosa fattibile? o i micro avr non hanno tale capacità di interfacciamento.

grazie
impulso_magnetico
 
Posts: 19
Joined: 16 Aug 2012, 15:22

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby flz47655 » 16 Aug 2012, 15:46

Ciao, secondo me implementando un IDE controller con una CPLD (es. MAXII EPM570) si riesce a fare tranquillamente, poi lo puoi interfacciare con Arduino.
Per quanto riguarda l'implementazione del controller http://www.altera.com/literature/an/an495.pdf può essere utile
Se vuoi realizzare il controller con un ATMega (con più pin dell'AtMega328p però) puoi vedere
http://code.google.com/p/idefat-arduino/ e http://opend.co.za/hardware/avride/avride.htm

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby impulso_magnetico » 16 Aug 2012, 16:08

grazie flz47655, ma che è un numero telefonico? :)

hai mai interfacciato l'harddisk usando queste librerie?
con che compilatore bisogna lavorare, con IDE arduino o necessita altro

intanto ti ringrazio molto per la pronta risposta.
ciao
impulso_magnetico
 
Posts: 19
Joined: 16 Aug 2012, 15:22

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby impulso_magnetico » 16 Aug 2012, 16:49

scusa flz
sto provando a compilare
http://code.google.com/p/idefat-arduino/
in particolare : IDEFatInfo.pde

Code: Select all
/*
 * This sketch attempts to initialize a IDE drive and analyze its structure.
 */
#include <IDEFat.h>
#include <IDEFatUtil.h>

// offset to partition table
#define PART_OFFSET (512-64-2)

IDE ide;
IDEVolume vol;

//global for ide erase sector size
uint32_t sectorSize;

void IDEError(void) {
  PgmPrintln("IDE error");
  PgmPrint("errorCode: ");
  Serial.println(ide.errorCode(), HEX);
  PgmPrint("errorData: ");
  Serial.println(ide.errorData(), HEX); 
  return;
}

// print partition table
uint8_t partDmp(void) {
  part_t pt;
  PgmPrintln("\npart,boot,type,start,length"); 
  for (uint8_t ip = 1; ip < 5; ip++) {
    if (!ide.readData(0, PART_OFFSET + 16*(ip-1), 16, (uint8_t *)&pt)) {
      PgmPrint("read partition table failed");
      IDEError();
      return false;
    }
    Serial.print(ip, DEC);
    Serial.print(',');
    Serial.print(pt.boot,HEX);
    Serial.print(',');
    Serial.print(pt.type, HEX);
    Serial.print(',');
    Serial.print(pt.firstSector);
    Serial.print(',');
    Serial.println(pt.totalSectors);
  }
  return true;
}

void volDmp(void) {
  PgmPrint("\nVolume is FAT");
  Serial.println(vol.fatType(), DEC);
  PgmPrint("blocksPerCluster: ");
  Serial.println(vol.blocksPerCluster(), DEC);
  PgmPrint("clusterCount: ");
  Serial.println(vol.clusterCount());
  PgmPrint("fatStartBlock: ");
  Serial.println(vol.fatStartBlock());
  PgmPrint("fatCount: ");
  Serial.println(vol.fatCount(), DEC);
  PgmPrint("blocksPerFat: ");
  Serial.println(vol.blocksPerFat());
  PgmPrint("rootDirStart: ");
  Serial.println(vol.rootDirStart());
  PgmPrint("dataStartBlock: ");
  Serial.println(vol.dataStartBlock());
  if (vol.dataStartBlock()%sectorSize) {
    PgmPrintln("Data area is not aligned on flash erase boundaries!");
  }
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  PgmPrintln("\ntype any character to start");
  while (!Serial.available());
  Serial.flush();
  uint32_t t = millis();

    uint8_t r = ide.init();
  t = millis() - t;
  if (!r) {
    PgmPrintln("\nide.init failed");
    IDEError();
    return;
  }
  PgmPrint("\ninit time: ");
  Serial.println(t);
  PgmPrint("\nide type: ");
  if(!partDmp()) return;
  if (!vol.init(&ide, 2)) {
    PgmPrintln("\nvol.init failed");
    IDEError();
    return;
  }
  volDmp();
}



sto usando la versione IDE 1.0.1 ma sto incontrando una serie di problemi

sono necessarie altre librerie ?
io non ho molta dimestichezza con l'ide di arduino perchè lavoro con AVRstudio,
potresti aiutarmi per risolvere il problema?
Last edited by impulso_magnetico on 16 Aug 2012, 17:39, edited 1 time in total.
impulso_magnetico
 
Posts: 19
Joined: 16 Aug 2012, 15:22

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby impulso_magnetico » 16 Aug 2012, 17:38

ok risolto,
con la versione 0022 funziona
con la 1.0.1 ha alcuni problemi di incompatibilità ..... come al solito !
impulso_magnetico
 
Posts: 19
Joined: 16 Aug 2012, 15:22

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby flz47655 » 16 Aug 2012, 17:50

Ok, vedo che hai già risolto. La libreria è per Arduino Mega e non Arduino Uno ad ogni modo.
Facci sapere cosa combini con un Hard-Disk :) io per motivi di spazio e praticità in genere uso schede SD

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby impulso_magnetico » 17 Aug 2012, 13:46

ho provato a scaricare su arduino l'hex,
ho effettuato le connessioni IDE con l'HD.... ma adesso pesno che ci sono problemi hardware.
boh! proverò con altri HD.

in ogni caso, cercando sulla rete ho trovato una libreria interamente scritta in assembly AVR per il bascom che però è a pagamento (circa 20 euro)
vedrò di dare una occhiata pure a questa.
magari dopo posto sul forum bascom
vi faccio sapere
impulso_magnetico
 
Posts: 19
Joined: 16 Aug 2012, 15:22

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby legacy » 21 Sep 2012, 13:31

beh spi MMC/SD ha consumi inferiori, occupa meno spazio, utilizza meno risorse hw (pin MPU)
di contro e' piu' lento
400Kbyte/sec...1000Kbyte/sec solitamente contro i 10Mbyte/sec...40Mbyte/sec del pATA
(sATA e' un mostro che addirittura e' capace di saturare la banda PCI
nessun micro potrebbe stargli dietro, anzi nessun computer basato su PCI, serve PCI express
e logiche toste, ASIC o FPGA, per interfacciare il trasporto seriale che adotta)

pPATA e' molto molto + semplice come interfaccia
tanto che era usato dai 286 in su, oggetti che hanno ironicamente meno banda di un AVR8
oggetti che pero' hanno iniziato a gestisce dma e dual buffering a livello di interfaccia

questa cosa richiederebbe un Xmega
spi+dma e' fattibile, ma e' un filo + complesso, perche' richiede non solo Xmega ma anche un po' di hw in piu'

con dischi elettromeccanici pATA si hanno tempi tseek non omogenei
con la conseguenza che servono algoritmi furbi per gestire dove scrivere le cose, dove=su quale cluster
mentre risultano costanti su spi MMC/SD il che significa poter fare indirizzamento casuale

tutti gli storage flash non hanno questo problema, i tempi di accesso al blocco dati non hanno memoria della storia dell'indirizzamento
puoi indirizzarli come ti pare, anche a caso, e avrei sempre gli stessi tempi di indirizzamento

con un disco elettromeccanico se la testina e' sulla traccia0 e tu richiedi un dato che sta sulla tracciaN-1 serve un tempo di volo
per muovere il braccetto da 0 a N-1 ... quindi hai dei tempi che dipendono da cosa hai fatto prima

detta cosi' spi MMC/SD sembra ideale per oggettini come arduino
perche' occupa pochi pin, non richiede algoritmi aggiuntivi per l'indirizzamento
e consuma di meno in termini di mA assorbiti

e mettiamoci anche che i dischi da 5" hanno bisogno di +5V e +12V
i dischi dei portatili da 2.5" solo +5V
con la scocciatura che devi comprare un adattatore 2.5"<->3.5"
perche' il connettorino che montano i 2.5" non e' troppo amichevole per poterlo filare

mentre spi MMC/SD hai soltanto una slittina in cui infilare la card
molto pratica e facilissima da saldare e maneggiare ed e' tutto alimentato a +3.3V

direi: pATA vs spi MMC/SD, pro e contro, e la lista potrebbe continuare

insomma per il layer0 sopratutto
(accesso diretto al dispositivo di storage, accesso per blocchi dati, non stiamo ancora parlando di filesystem)
tutto dipende da cosa uno ci deve fare

se e' un datalogger lento, e' molto molto meglio usare spi MMC/SD


se per altre ragioni e' stato scelto pATA
io operativamente io spezzerei il problema in 2 parti:

1) mappatura LBA, geometria disco, e miscellanee per accesso fisico raw, scrittura/lettura di blocchi dati (512byte) per LBA (logic block address)
2) filesystem sopra, in questo caso FAT32, con indirizzamento per cluster (1 o n blocchi dati da 512byte, indirizzati per LBA contigui).
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: Interfacciare Hard-Disk IDE con Arduino?

Postby impulso_magnetico » 29 Sep 2012, 22:13

Salve, alla fine ho risolto
utilizzando Avr-dos di Bascom compilato per un atmega128 sono riuscito a riutilizzare quasi tutti gli hd che avevo in casa, circa 20.
le capacità variano tra 40 e 120gb e vanno che è una bellezza, non credevo ai miei occhi quando sono riuscito a leggere i vecchi file contenuti su quei hd.
Il sistema di cui vi parlo permette di creare DIR e file, di aprire file di tutti i tipi, di cancellare, di rinominare, ossia tutto quello che è possibile fare con un DOS.
Ho già in testa qualche applicazione per utilizzare questi HD anche se consumano un tantino... ma 120Gb fanno veramente gola specie se gestiti con un atmega128.

Lasciatemi dire una cosa.....
Altro che gestione con ide-arduino :?

ciao
impulso_magnetico
 
Posts: 19
Joined: 16 Aug 2012, 15:22


Return to Microcontrollori e microprocessori

Who is online

Users browsing this forum: No registered users and 8 guests

cron