יום שבת, 21 בספטמבר 2013

Arduino MicroSD



עד עכשיו דגמנו חיישנים והעברנו את המידע דרך החיבור הסיראלי בחזרה למשתמש אבל זה לא מספיק, נניח שיש לנו חיישן שאנחנו רוצים לנטר אותו לאורך טווח ולאסוף עליו סטטיסטיקות ,אין מספיק שטח אחסון על ה Arduino שישמור לנו את המידע ולכן צריכים שטח אחסון חיצוני, אחת הדרכים הנפוצות היא לעבוד עם MicroSD Card Module , את שלי מצאתי ב DX במחיר של 4 דולר ולצורך הדוגמה אני אשתמש בו בשביל לשמור נתונים שמגיעים מחיישן טמפרטורה.


דרישות:

  • Arduino Uno
  • MicroSD Module
  • (MicroSD 4GB (FAT32 Limit
  • TMP36
  • Breadboard
  • Wires




Serial Peripheral Interface

ממשק ותיק להעברת נתונים בין רכיבים בניגוד לממשק ה Uart שמורכב סה"כ מ 2 חיבורים (RX,TX) , ב SPI נדרשים 4 חיבורים לפחות על מנת להשלים את ההתחברות וניתן לחבר עוד רכיבים על אותו ממשק, לכל רכיב שתומך ב  SPI יש 4 פינים שאותם מחברים ל (Master (Arduino ובעזרתו מנתבים את המידע בין הרכיבים השונים.
  • SCK - פעימת שעון מה Master.
  • MISO- Master In Slave Out - מידע שעובר מה Master ל Slave.
  • MOSI - Master Out Slave In - מידע שעובר מה Slave ל Master.
  • CS - Chip Select - בחירת הרכיב שאיתו מדבר ה Master, כמות החיבורים משתנה ב Master לפי כמות הרכיבים.
במקרה שנרצה לשלוח מידע לרכיב ספציפי נוריד את ה Chip Select של אותו רכיב ל LOW ובשאר הרכיבים ל HIGH על מנת שהתעלמו מהמידע, ניתן לשלוח את אותו מידע גם בצורה פרללית לכל הרכיבים  כשנוריד את ה Chip Select לכולם או להפך בשביל שהתעלמו. 


Serial Peripheral Interface


ב Arduino יש מספר פינים קבועים שדרכם מבצעים את ההממשקות ל SPI אבל הם עלולים להשתנות בין הדגמים ניתן לדעת אותם במדוייק באתר הרשמי של Arduino.





קוד

התוכנית עצמה מאוד פשוטה , דוגמים את החיישן בכל שנייה, אוספים את הנתונים ורושמים אותם לכרטיס ה SDcard, משתמשים בספריה מוכנה (SD.h) שבאה עם הסביבה של ה Arduino שמנהלת את שטח אחסון ומאפשרת לעבוד עם Filesystem מסוג FAT עד לנפח 4 GB.

#include <SD.h>

int tempPin = 0;
int csPin = 10;

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

void loop(){
  //get the milivolts
  float temp  = getVoltage(tempPin);

  float Celsius = 0;
  float Fahrenheit = 0;

  //convert the milivolts to Fahrenheint
  Fahrenheit = (((temp -.5)*100)*1.8)+32;
  
  //convert Fahrenheint to Celsius
  Celsius = ((Fahrenheit - 32) * 5 ) /9;
  
  //write values to SD card
  writeSD(Celsius,Fahrenheit);
  
  delay(1000);
}

//check if the chip select available
void initSD(){
   pinMode(csPin, OUTPUT);
    if (!SD.begin(csPin)) {
    Serial.println("Load SD failed!");
  }
  Serial.println("Load SD complete.");
}

//reading the analogpin and getting 
//the milivoltages.
float getVoltage(int pin)
{
  return (analogRead(pin) * .004882814);
}

void writeSD(int Celsius, int Fahrenheit){
  
  String str = "Celsius: " + String(Celsius) + " Fahrenheit: " + String(Fahrenheit);
  
  //try to write file
  File dataFile = SD.open("log.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println(str);
    dataFile.close();
    Serial.println(str);
  }  
  else {
    Serial.println("error opening file");
  } 
  
}


מבנה סופי




סיכום

אין גבול למה שאפשר לעשות עם Arduino וראינו את זה לאורך כל המאמרים בנושא, שטח אחסון הוא דבר קריטי במקרה שנרצה לאסוף מידע לאורך זמן והפתרון עם MicroSD בהחלט עושה את העבודה ונותן לנו אפשרויות שלא היו לפני כמו לעבוד עם קבצי הגדרות, לכתוב ולקרוא מידע ולשמור עליו לפעמים הבאות.

איזה שכלול... 





יום שבת, 7 בספטמבר 2013

OpenWRT - Custom Router Guide




לכל מי שיש Router מיותר זה מאמר בדיוק בשבילו, לאחרונה נתקלתי בנתב ישן בבית שמחוץ לעלות אבק הוא לא כל כך מועיל וחשבתי לעצמי האם ניתן לשפר אותו? או להתקין עליו מערכת חדשה? מסתבר שזה אפשרי בעזרת הפרויקט OpenWRT שמאפשר להתקין מערכת הפעלה של Linux ע"ג נתבים שונים ומגוונים, צריבת מערכת הפעלה חדשה על מכשירים סגורים של יצרנים עלולה להרוס את המכשיר כמו שתראו בהמשך.

OpenWRT

מערכת Linux Embedded שתומכת ברוב הארכיטקטורת מעבד שבשוק, מתאימה בעיקר למוצרים כמו Routers ומוצרי תקשורת אחרים, היא התחילה את דרכה בשנת 2004, היא הותאמה בעיקר לנתבים של LinkSys אבל עם הזמן התרחבה לנתבים מחברות שונות.

שימו לב!
  • לפני שאתם חושבים לשדרג את הנתב שלכם כדאי שתבדקו בטבלת התמיכה שנמצאת באתר ותוודאו שהנתב שלכם ברשימה.
  • התהליך שמוצג במאמר יכול להרוס את המכשיר ברשותכם ללא יכולת לשחזור ותיקון , אני לא אחראי על כל נזק שנגרם לנתב שלכם - ראו הוזהרתם!
לאחר שמצאנו את הנתב בטבלה ברוב המקרים יש הסבר מפורט איך להתקין את מערכת ההפעלה ואת ה BootLoader אם לא מצאתם הסבר כזה לא מומלץ להתקין את מערכת ההפעלה כי סביר להניח שזה לא יעבוד ותהרסו את המכשיר.


D-Link Dir-300 A



המתנדב לניסוי הוא נתב ישן של D-LINK עם 4 כניסות LAN, כניסת WAN ו WIFI, הוא מבוסס על מעבד MIPS במהירות 182 MHZ עם 4 MB של FLASH ו 16 MB של RAM.

שימו לב! - לכל נתב יש תהליך צריבה משלו חשוב מאוד לעבור אחרי ההוראות באתר OpenWRT ומומלץ לחפש במקורות נוספים באינטרנט.

לפני שנתחיל לעבוד על הנתב יש מספר תוכנות שמומלץ להכין מראש:
  • PUTTY - תוכנה להתחברות בפרוטוקולים שונים כמו Telnet, SSH ו Serial.
  • WINSCP - תוכנה להעברת קבצים בעזרת SSH.
  • TFTPD32 - תוכנה להעברת קבצים בפרוטוקל Trivial File Transfer Protocol.
  • Port Scanner - סריקה מהירה של פורטים על הנתב.

יש להוריד מספר קבצים מאתר OpenWRT:


תחילה יש להחליף את ה Bootloader המקורי (RedBoot) ל BootLoader של OpenWRT שנקרא DD-WRT, התהליך עצמו קצת מוזר נותנים למחשב כתובת סטטית 192.168.20.80 ומחברים אותו לכניסת ה WAN בנתב, מחברים את הנתב לחשמל ונפתח לנו חלון של כמה שניות שדרכו ניתן להתחבר לנתב בעזרת Telnet בכתובת 192.168.20.81 בפורט 9000, זה לא תמיד מצליח ולפעמים צריך לכבות ולהפעיל את הנתב מספר פעמים עד שנכנסים לאחר מכן מכניסים את הפקודה:

Redboot> load ap61.ram
Redboot> go.

חשוב מאוד שתוכנת ה TFTP תעבוד ותצביע לתיקייה עם הקבצים הנחוצים, ברגע הרצת הפקודה הנתב ינסה למשוך את הקבצים מהמחשב ובסיום יש להפעיל את הנתב מחדש לא לפני שננתק את המחשב מה WAN ונחבר אותו לאחד כניסות ה WAN ונגדיר את הכתובת 192.168.1.2, נעשה את אותו טריק ונפעיל את הנתב מחדש וננסה להתחבר לכתובת 192.168.1.1 בפורט 9000, לאחר שהתחברנו מחדש נריץ את הפקודות הבאות:

כניסה למצב כתיבה לזיכרון:
DD-WRT>fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .

הגדרת TFTP:

DD-WRT>ip_address -h 192.168.1.2
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2


כתיבת ה ROM מה TFTP:

DD-WRT>load -r -b %{FREEMEMLO} ap61.rom
Using default protocol (TFTP)
Raw file loaded 0x80080000-0x800a8717, assumed entry at 0x80080000


כתיבת ה Bootloader באופן קבוע:

DD-WRT>fis create -l 0x30000 -e 0xbfc00000 RedBoot
An image named 'RedBoot' exists - continue (y/n)? y
... Erase from 0xbfc00000-0xbfc30000: ...
... Program from 0x80080000-0x800a8718 at 0xbfc00000: ...
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .


הגדרת Bootp:

DD-WRT>fconfig bootp false
bootp: Setting to false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: . 



בסיום נריץ את הפקודה Reset ובפעם האחרונה שוב נתחבר בעזרת Telnet לכתובת 192.168.1.1 בפורט 9000, ונריץ את הפקודות הבאות:


כניסה למצב כתיבה לזיכרון:
DD-WRT>fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .


הגדרת TFTP:

DD-WRT>ip_address -h 192.168.1.2
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2

טעינת קובץ מערכת ההפעלה לזיכרון

DD-WRT>load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x801007ff, assumed entry at 0x80040800


כתיבת הקובץ לנקודה ספציפית בזיכרון:

DD-WRT>fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
... Erase from 0xbfc30000-0xbfcf0000: ............
... Program from 0x80040800-0x80100800 at 0xbfc30000: ............
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .

טעינת קובץ של ה File System  לזיכרון:

DD-WRT>load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x802207ff, assumed entry at 0x80040800''


כתיבת ה File System לזיכרון באופן קבוע:
DD-WRT>fis create rootfs
... Erase from 0xbfcf0000-0xbffe0000: ...............................................
... Program from 0x80040800-0x80220800 at 0xbfcf0000: ..............................
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .

הגדרת זמן טעינת ה Bootloader:

DD-WRT>fconfig boot_script_timeout 5


הגדרת טעינת Script בזמן שה Bootloader עולה:

DD-WRT>fconfig boot_script true
Run script at boot: true 

הגדרת הפקודה ב Script:

DD-WRT>fconfig
Run script at boot: true
Boot script:
Enter script, terminate with empty line
>> fis load -l vmlinux.bin.l7
>> exec
>>

הנתב יציג פרמטרים נוספים ובסיום יש לבצע Reset:

Boot script timeout (1000ms resolution): 5
Use BOOTP for network configuration: false
Gateway IP address: 192.168.1.1
Local IP address: 192.168.1.10
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.1.228
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .''

DD-WRT>reset

זהו אפשר לומר שסיימנו וכרגע על הנתב מותקנת מערכת הפעלה חדשה, נתחבר לנתב בעזרת Telenet לכתובת 192.168.1.1 הפעם בפורט הסטנדרטי (23), נוכל להגדיר סיסמא ,להתחבר בעזרת SSH וכמובן לנהל את הנתב בעזרת הדפדפן.





Brick Device

מה שראינו זה תהליך שכנראה קורה רק בתאוריה ובפועל העסק הולך ומסתבך, אחד הטעויות שעשיתי היא שהורדתי את הקבצים של הגרסה האחרונה מ OpenWRT וזו היתה טעות רצינית, מסתבר שהתקנתי גרסה חדשה מידי שלא ממש תואמת לנתב שגרמה לו לעשות Reset כל הזמן ולא היה ניתן להתקין עליו אף תוכנה, עשיתי Reflashing אבל זה רק עשה את זה יותר גרוע ולא הצלחתי להתחבר אליו בשום צורה, בקיצור הנתב נהפך ל Brick וההיתי בטוח שזה הסוף, אבל מסתבר ש D-LINK לא הורידה מהלוח את האפשרות להתחבר בעזרת חיבור סיראלי והפינים עדיין קיימים ,זו היתה הדרך היחידה להציל את המצב.


לאחד הפרוייקטים שלי רכשתי לוח Breakout Board מחברת Sparkfun שמחבר בין UART ל USB, מחירו בסביבות 15 דולר, מחברים את יציאת ה RX בנתב ל TX ב Breakout ואת ה TX בנתב ל RX ב Breakout כמובן לא לשכוח את ה GND ,מתחברים עם Putty ומתחילים לצרוב אותו מחדש.


מסתבר שהתקנתי את הגרסה Barrier Breaker אבל הגרסה המתאימה ביותר עבור אותו נתב היא Kamikaze לכן יש לעיין בקבצים באתר לפני ההתקנה.

מבנה סופי


סיכום:

עבודה עם OpenWRT מאפשרת לנו לשדרג נתבים ישנים ולהפוך אותם למכונת Linux לכל דבר, חשוב מאוד לאסוף את כל המידע הדרוש מהאתר OpenWRT וכמובן לחפש במקורות נוספים, במקרה שלי היה לי מזל שעדיין היה ניתן להתחבר בעזרת חיבור סיראלי שזה לא מובן מאליו לכן יש להשים לב לכל דבר קטן בתהליך ולעשות אותו בצורה המתאימה תוך שיקול דעת כי זה יכול להיות הרגעים האחרונים לנתב לפני שהוא נהרס לחלוטין.

לאתר הרשמי:

שדרגו בחוכמה!

יום רביעי, 4 בספטמבר 2013

FreeNAS Guide




בהמשך למאמר MyCloud Guide (עבר קצת זמן...) הקמתי סביבה וירטואלית חינמית בעזרת ProxMox שמבוסס על KVM הפעם אתמקד על שירותי הקבצים בענן בעזרת סביבה חינמית נוספת שנקראת FreeNAS שמבוססת על FreeBSD ומאפשרת להגדיר שטחי אחסון שונים לסביבה הוירטואלית או בכלל לסביבת העבודה.

Network Attach Storage

רכיבי אחסון חיצוניים שנתונים שירותים שונים ע"ג הרשת ומאפשרים לשרתים ולסביבות עבודה לגשת למשאב בעזרת חיבורים סטנדרטים ואינם תלויים בשרת עצמו, מפרידים את שטח האחסון מהשרת שיוכל לבצע את המשימה שאליה הוא נדרש מבלי לנהל את הבקשות לכתיבה ולקריאה שאותן שולחים לשרת אחר שזה תפקידו.



ניתן להוריד את קובץ ה ISO מכאן, הפרוצדורה חוזרת על עצמה כמו שראינו בעבר, צורבים את ISO לדיסק ונותנים לו לרוץ במקרה שלי לצורך הדוגמה עשיתי את ההתקנה על תחנה וירטואלית.



שימו לב - צריכים לפחות 2 כוננים , על אחד מהם מתקינים את מערכת ההפעלה שלא תופסת יותר מידי ,והשני הוא שטח האחסון המרכזי, ניתן לחבר מספר דיסקים ב Raid על מנת לשמור על אמינות אבל על זה נדבר במאמרים הבאים.



בסיום טעינת המערכת מקבילים כתובת שדרכה מנהלים את ה Storage מהדפדפן , הממשק מאוד ידידותי וניתן לעשות איתו המון, ניתן להוריד Plugins עבור שירותים מיוחדים כמו BitTorrent , Streaming וכו'.



על מנת לבנות את ה Share הראשון יש להגדיר תחילה Volume עבור הדיסק, לצורך הדוגמה יצרתי דיסק בפורמט של UFS - Unix File System אבל ניתן לבחור פורמטים נוספים כמו NTFS - New Technology Files System שפותחה ע"י Microsoft.



ההרשאות מבוססות על Unix לצורך הדוגמה נתתי הרשאה 777 שמאפשרת קריאה וכתיבה של כל אחד, על מנת לאבטח את המערכת מומלץ ליצור פרופיל של משתמש חדש ולתת את ההרשאות המתאימות.



המערכת יודעת לתת שירותי CIFS - Common Internet File System שמתאימים למערכות Windows אבל גם שירותי NFS - Network File System עבור מערכות Linux שגם נתמכים ע"י Microsoft אבל מצריכים את ההתקנה של Service For Network File System כחלק מה Features שמגיעים עם מערכת ההפעלה, במקרה שלי יצרתי Share חדש מסוג CIFS ונתתי גישה עבור Guest User שזו הרשאה נוספת ברמת הפרוטוקול.



ניתן להוסיף עוד שירותים מגוונים על גבי שטח האחסון כמו FTP, NFS,ISCSI  וכדומה.




זהו ה Share מוכן לעבודה, אין כסף!


סיכום

מערכות אחסון הם עסק יקר מאוד אז אם יש ברשותכם מחשב ישן עם כמה כוננים מיותרים אתם יכולים לבנות לכם אחלה מכונת אחסון נוחה עבור כל המידע שלכם, יש גם המון חברות מסחריות שהטמיעו את המוצר כמו דיסני, האומות המאוחדות ועוד כל מיני גופים גדולים אחרים, היעוד של מערכת ההפעלה  כ OpenSource מאפשר לפתח פתרונות אחסון אמינים וזולים לפי דרישת הלקוח.

לאתר הרשמי


שנה טובה!