Li-Po bataryalar ya da diğer adı ile lityum polimer batarylar yeniden sarj edilebilir ve flex bir yüzeye sahip lityum iyon teknolojisi ile çalışan bataryalardır.Batarya ağırlığının kritik olduğu projelerde sıklıkla kullanılmaktadırlar.Genel olarak radyo frekansı ile kontrol edilen uçak modeller,uzaktan kontrollü yürür ekipmanlarda kullanılırlar.
Yukarıdaki devre 3,7V/630mAh bir lityum batarya hücresinin şarj ünitesini temsil etmektedir.Şarj etme voltajı 4V olup yine şarj etme akım kapasitesi ise 63mA ile sınırlıdır.
Yukarıdakini devrenin ana kalbini LM324 oluşturmaktadır.Burada LM324 karşılaştırıcı olarak kullanılmıştır.Referans voltajı bu devrede 3,5V olup,Vref=(9/(R1+R2))*(R1) formülü ile elde edilmektedir.
Burada bataryanın pozitif ucu D1 diyotu tarafından bağlanılmakta ve R5 ise sadece pull down direnci görevi görmektedir.
Devremizde D2 ledi sadece sistemin durumunu belirtme amacı ile kullanılmıştır.Batarya şarj olma süresi boyunca yanıp sönecek olan bu led,bataryamız şarj olduğunda ise sürekli yanar hale gelerek bizi uyaracaktır.IC 7809 voltaj regulatörü ise 12V güç kaynağımızdan kararlı bir şekilde 9V elde etmemizi sağlamaktır.
Li-Po battery or Lithium-Polymer battery is a rechargeable battery based on the Lithium-ion technology enclosed in a flexible pouch. This soft, flexible pouch makes them very light with a compromise in mechanical strength. Li-Po batteries are widely used in applications where weight is a critical factor. The common applications are radio controlled model flight, RC toys, hand held devices etc.
The Lithium Polymer battery is evolved from the Lithium Metal Batteries.The main difference is that instead of using Lithium salt electrolyte binded in organic solvents like Ethylene carbonate, Di Methyl Carbonate Di Ethyl Carbonate , Li-Po batteries use polymer electrolytes like Poly Ethylene Oxide, Poly Methyl Methacrylate, Poly Acrilonitrile etc. The output voltage of Li-Po battery depends up on the technology used behind it. It is 2.7-3.0 V (discharged) to 4.20-4.35 V( charged) for cells based on Lithium Metal Oxides and it is 1.8-2.0 V (discharged) to 3.6-3.8 V (charged) for cells based on Lithium Iron Phosphate. The charging current is usually 1/5 of the mAH rating of the battery.
Like other Lithium batteries the Li-Po batteries are also prone to problems related with over charging, deep discharging, over temperature, short circuit etc. Any of these problem may result in permanent damage to the battery or even explosion. In order to avoid such problems, great care must be given while designing LiPo battery charger circuits.
Here we are discussing about a LiPo battery charger that can charge a 3.7V/360mAh cell. The charging voltage is limited to 4 volts for safety and the charging current is limited to 63mA.
When ever the battery voltage is above 4 volts the voltage fed back to the inverting input will be higher than 3.5 voltas. That is 4V-D1 drop =3.5V. The output of the opamp swings to ground and transistor Q1 will be switched OFF. This isolates the battery from the charging voltage and the battery remains safe. When the battery voltage is below 4V, the voltage fed back to the inverting input will be lower than 3.5V and the output of the opamp swings to positive saturation. This makes the transistor ON and the battery starts charging. Resistor R4 limits the charging current of the battery to 60 mA. The governing equation is (Vcc-VcesatQ1-Vb)/R4=Ib. Where Vcc is the supply voltage, VcesatQ1 is the collector-emitter voltage of Q1 during saturation, Vb is the battery voltage when discharged, R4 is the current limiting resistor and Ib is the charging current. When substituted by values it is (9V-0.2V-2.7V)/100 ohm=61mA.
LED D2 is just and indicator.It glows the the battery is charging and extinguishes when the battery is fully charged. Voltage regualtor IC 7809 is used for producing steady 9V from the 12V supply.
Source: http://www.circuitstoday.com/lipo-battery-charger-circuit
Maybe most of the people think that Arduino is suitable for industrial usage or not?
I cant give a answer excatly.But i can say that i saw some industrial libraries for arduino projects.
1. Modbus library :
One of the most common protocol is modbus which is using for devices communication in a ring
#include <SoftwareSerial.h> /*-----( Declare Constants and Pin Numbers )-----*/ #define SSerialRX 10 //Serial Receive pin #define SSerialTX 11 //Serial Transmit pin #define SSerialTxControl 3 //RS485 Direction control #define RS485Transmit HIGH #define RS485Receive LOW #define Pin13LED 13 /*-----( Declare objects )-----*/ SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX /*-----( Declare Variables )-----*/ int byteReceived; int byteSend; void setup() /****** SETUP: RUNS ONCE ******/ { // Start the built-in serial port, probably to Serial Monitor Serial.begin(9600); Serial.println("YourDuino.com SoftwareSerial remote loop example"); Serial.println("Use Serial Monitor, type in upper window, ENTER"); pinMode(Pin13LED, OUTPUT); pinMode(SSerialTxControl, OUTPUT); digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver // Start the software serial port, to another device RS485Serial.begin(4800); // set the data rate }//--(end setup )--- void loop() /****** LOOP: RUNS CONSTANTLY ******/ { digitalWrite(Pin13LED, HIGH); // Show activity if (Serial.available()) { byteReceived = Serial.read(); digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit RS485Serial.write(byteReceived); // Send byte to Remote Arduino digitalWrite(Pin13LED, LOW); // Show activity delay(10); digitalWrite(SSerialTxControl, RS485Receive); // Disable RS485 Transmit } if (RS485Serial.available()) //Look for data from other Arduino { digitalWrite(Pin13LED, HIGH); // Show activity byteReceived = RS485Serial.read(); // Read received byte Serial.write(byteReceived); // Show on Serial Monitor delay(10); digitalWrite(Pin13LED, LOW); // Show activity } }//--(end main loop )--- /*-----( Declare User-written Functions )-----*/ //NONE //*********( THE END )***********
Slave Arduino
#include <SoftwareSerial.h> /*-----( Declare Constants and Pin Numbers )-----*/ #define SSerialRX 10 //Serial Receive pin #define SSerialTX 11 //Serial Transmit pin #define SSerialTxControl 3 //RS485 Direction control #define RS485Transmit HIGH #define RS485Receive LOW #define Pin13LED 13 /*-----( Declare objects )-----*/ SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX /*-----( Declare Variables )-----*/ int byteReceived; int byteSend; void setup() /****** SETUP: RUNS ONCE ******/ { // Start the built-in serial port, probably to Serial Monitor Serial.begin(9600); Serial.println("SerialRemote"); // Can be ignored pinMode(Pin13LED, OUTPUT); pinMode(SSerialTxControl, OUTPUT); digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver // Start the software serial port, to another device RS485Serial.begin(4800); // set the data rate }//--(end setup )--- void loop() /****** LOOP: RUNS CONSTANTLY ******/ { //Copy input data to output if (RS485Serial.available()) { byteSend = RS485Serial.read(); // Read the byte digitalWrite(Pin13LED, HIGH); // Show activity delay(10); digitalWrite(Pin13LED, LOW); digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit RS485Serial.write(byteSend); // Send the byte back delay(10); digitalWrite(SSerialTxControl, RS485Receive); // Disable RS485 Transmit // delay(100); }
2. PID library:
In industrial control elements pid control is really essential
pid.h :
#ifndef PID_v1_h
#define PID_v1_h
#define LIBRARY_VERSION 1.1.1
class PID
{
public:
//Constants used in some of the functions below
#define AUTOMATIC 1
#define MANUAL 0
#define DIRECT 0
#define REVERSE 1
//commonly used functions **************************************************************************
PID(double*, double*, double*, // * constructor. links the PID to the Input, Output, and
double, double, double, int); // Setpoint. Initial tuning parameters are also set here
void SetMode(int Mode); // * sets PID to either Manual (0) or Auto (non-0)
bool Compute(); // * performs the PID calculation. it should be
// called every time loop() cycles. ON/OFF and
// calculation frequency can be set using SetMode
// SetSampleTime respectively
void SetOutputLimits(double, double); //clamps the output to a specific range. 0-255 by default, but
//it's likely the user will want to change this depending on
//the application
//available but not commonly used functions ********************************************************
void SetTunings(double, double, // * While most users will set the tunings once in the
double); // constructor, this function gives the user the option
// of changing tunings during runtime for Adaptive control
void SetControllerDirection(int); // * Sets the Direction, or "Action" of the controller. DIRECT
// means the output will increase when error is positive. REVERSE
// means the opposite. it's very unlikely that this will be needed
// once it is set in the constructor.
void SetSampleTime(int); // * sets the frequency, in Milliseconds, with which
// the PID calculation is performed. default is 100
//Display functions ****************************************************************
double GetKp(); // These functions query the pid for interal values.
double GetKi(); // they were created mainly for the pid front-end,
double GetKd(); // where it's important to know what is actually
int GetMode(); // inside the PID.
int GetDirection(); //
private:
void Initialize();
double dispKp; // * we'll hold on to the tuning parameters in user-entered
double dispKi; // format for display purposes
double dispKd; //
double kp; // * (P)roportional Tuning Parameter
double ki; // * (I)ntegral Tuning Parameter
double kd; // * (D)erivative Tuning Parameter
int controllerDirection;
double *myInput; // * Pointers to the Input, Output, and Setpoint variables
double *myOutput; // This creates a hard link between the variables and the
double *mySetpoint; // PID, freeing the user from having to constantly tell us
// what these values are. with pointers we'll just know.
unsigned long lastTime;
double ITerm, lastInput;
unsigned long SampleTime;
double outMin, outMax;
bool inAuto;
};
#endif
pid.cpp:
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <PID_v1.h>
/*Constructor (...)*********************************************************
* The parameters specified here are those for for which we can't set up
* reliable defaults, so we need to have the user set them.
***************************************************************************/
PID::PID(double* Input, double* Output, double* Setpoint,
double Kp, double Ki, double Kd, int ControllerDirection)
{
myOutput = Output;
myInput = Input;
mySetpoint = Setpoint;
inAuto = false;
PID::SetOutputLimits(0, 255); //default output limit corresponds to
//the arduino pwm limits
SampleTime = 100; //default Controller Sample Time is 0.1 seconds
PID::SetControllerDirection(ControllerDirection);
PID::SetTunings(Kp, Ki, Kd);
lastTime = millis()-SampleTime;
}
/* Compute() **********************************************************************
* This, as they say, is where the magic happens. this function should be called
* every time "void loop()" executes. the function will decide for itself whether a new
* pid Output needs to be computed. returns true when the output is computed,
* false when nothing has been done.
**********************************************************************************/
bool PID::Compute()
{
if(!inAuto) return false;
unsigned long now = millis();
unsigned long timeChange = (now - lastTime);
if(timeChange>=SampleTime)
{
/*Compute all the working error variables*/
double input = *myInput;
double error = *mySetpoint - input;
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
double dInput = (input - lastInput);
/*Compute PID Output*/
double output = kp * error + ITerm- kd * dInput;
if(output > outMax) output = outMax;
else if(output < outMin) output = outMin;
*myOutput = output;
/*Remember some variables for next time*/
lastInput = input;
lastTime = now;
return true;
}
else return false;
}
/* SetTunings(...)*************************************************************
* This function allows the controller's dynamic performance to be adjusted.
* it's called automatically from the constructor, but tunings can also
* be adjusted on the fly during normal operation
******************************************************************************/
void PID::SetTunings(double Kp, double Ki, double Kd)
{
if (Kp<0 || Ki<0 || Kd<0) return;
dispKp = Kp; dispKi = Ki; dispKd = Kd;
double SampleTimeInSec = ((double)SampleTime)/1000;
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;
if(controllerDirection ==REVERSE)
{
kp = (0 - kp);
ki = (0 - ki);
kd = (0 - kd);
}
}
/* SetSampleTime(...) *********************************************************
* sets the period, in Milliseconds, at which the calculation is performed
******************************************************************************/
void PID::SetSampleTime(int NewSampleTime)
{
if (NewSampleTime > 0)
{
double ratio = (double)NewSampleTime
/ (double)SampleTime;
ki *= ratio;
kd /= ratio;
SampleTime = (unsigned long)NewSampleTime;
}
}
/* SetOutputLimits(...)****************************************************
* This function will be used far more often than SetInputLimits. while
* the input to the controller will generally be in the 0-1023 range (which is
* the default already,) the output will be a little different. maybe they'll
* be doing a time window and will need 0-8000 or something. or maybe they'll
* want to clamp it from 0-125. who knows. at any rate, that can all be done
* here.
**************************************************************************/
void PID::SetOutputLimits(double Min, double Max)
{
if(Min >= Max) return;
outMin = Min;
outMax = Max;
if(inAuto)
{
if(*myOutput > outMax) *myOutput = outMax;
else if(*myOutput < outMin) *myOutput = outMin;
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
}
}
/* SetMode(...)****************************************************************
* Allows the controller Mode to be set to manual (0) or Automatic (non-zero)
* when the transition from manual to auto occurs, the controller is
* automatically initialized
******************************************************************************/
void PID::SetMode(int Mode)
{
bool newAuto = (Mode == AUTOMATIC);
if(newAuto == !inAuto)
{ /*we just went from manual to auto*/
PID::Initialize();
}
inAuto = newAuto;
}
/* Initialize()****************************************************************
* does all the things that need to happen to ensure a bumpless transfer
* from manual to automatic mode.
******************************************************************************/
void PID::Initialize()
{
ITerm = *myOutput;
lastInput = *myInput;
if(ITerm > outMax) ITerm = outMax;
else if(ITerm < outMin) ITerm = outMin;
}
/* SetControllerDirection(...)*************************************************
* The PID will either be connected to a DIRECT acting process (+Output leads
* to +Input) or a REVERSE acting process(+Output leads to -Input.) we need to
* know which one, because otherwise we may increase the output when we should
* be decreasing. This is called from the constructor.
******************************************************************************/
void PID::SetControllerDirection(int Direction)
{
if(inAuto && Direction !=controllerDirection)
{
kp = (0 - kp);
ki = (0 - ki);
kd = (0 - kd);
}
controllerDirection = Direction;
}
/* Status Funcions*************************************************************
* Just because you set the Kp=-1 doesn't mean it actually happened. these
* functions query the internal state of the PID. they're here for display
* purposes. this are the functions the PID Front-end uses for example
******************************************************************************/
double PID::GetKp(){ return dispKp; }
double PID::GetKi(){ return dispKi;}
double PID::GetKd(){ return dispKd;}
int PID::GetMode(){ return inAuto ? AUTOMATIC : MANUAL;}
int PID::GetDirection(){ return controllerDirection;}
3. Map function:
Map function is the one of the most critical point for industrial automation.Sometimes we need that scale our outputs accordig to out input parameters
/* Map an analog value to 8 bits (0 to 255) */
void setup() {}
void loop()
{
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}
void setup() {}
void loop()
{
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}
If you want to control your automation by different processors then you need to communicate with them to keep autiomate your system.Sofware serial provides you extra serial interface and connection for arduino projects.
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
Windows 8.1 single language işletim sisteminde en büyük sıkıntılardan biri sistemin dilini değiştirebilmek.Normal yollardan denetim masası üzerinden update ile türkçe dil paketini almaya kalktığınızda inglizce olarak size bu işletim sistemi versiyonu için uygulanamaz yazısı çıkacaktır.
Bunun çözümü ise bu updati bir nevi manuel olarak gerçekleştirmektir.
Peki bunu nasıl yapacağız ?
İlk olarak işletim sistemimizde yüklü olan dil paketini kontrol edeceğiz.
başlat üzerinde cmd yi run as administrator olarak başlatalım.Neden yönetici olarak başlatıyoruz? Çünkü sistemimizde yükl ü olan dilleri bir txt doyası içerisinde atarak incelemeyi deneyeceğiz.
cmd yi yönetici olarak çalıştırdık sonrasında
dism /Online /Get-Packages > c:\elektro-blogger.txt
komutunu yazıp enter yapıyoruz.Bu işlem C klasörü içerisinde elektro-blogger.txt adı ve uzantısı ile bize dil paketlerimizi gösterecek. Txt dosyası içerisinde aşağıdakine yakın bir yazı bulacaksınız
Deployment Image Servicing and Management tool
Version: 6.3.9600.17031
Image Version: 6.3.9600.17031
Packages listing:
Package Identity : Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384
State : Installed
Release Type : Feature Pack
Install Time : 9.6.2014 03:24
Package Identity : Microsoft-Windows-Branding-CoreConnectedSingleLanguage-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384
State : Installed
Release Type : Language Pack
Install Time : 18.3.2014 09:38
Kırmızı ile belirttiğimiz alanı kopyalayalım daha sonrasında ingilizce dil paketini kaldırmak için bize gerekli olacak.
32 Bit - 64 Bit işletim sistemimize göre yandaki türkçe dil paketlerinden birini indirelim
İçinden çıkan lp.cab uzantılı dosyayı C klasörü içerisine koyalım sonrasında ise cmd komut penceresine
dism /Online /Add-Package /PackagePath:C:\lp.cab
Komutunu girelim
Bu kısım biraz uzun sürecektir.Yükleme tamamlandıktan sonra sıra geldi ingilizce dil paketini kaldırmaya
Yukarıda kırmızı olarak belirtilen sizdeki ingilizce dil paketi karşılığını kopyalayım
Sonrasında ise Cmd komut satırımıza
dism /Online /Remove-Package /PackageName:Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384
Burada dikkat etmenize gereken Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384 satırının sizin txt dosyası içerisinde kopyaladığınız kısım olması
Bu işlemde biraz uzun sürecektir.İşlem tamamlandıktan sonra ise size sistemi tekrar başlatmak istediğini söyleyecektir.Sistem tekrar başladığında ise artık türkçe olarak kullanabileceksiniz.
Bunun çözümü ise bu updati bir nevi manuel olarak gerçekleştirmektir.
Peki bunu nasıl yapacağız ?
İlk olarak işletim sistemimizde yüklü olan dil paketini kontrol edeceğiz.
cmd yi yönetici olarak çalıştırdık sonrasında
dism /Online /Get-Packages > c:\elektro-blogger.txt
komutunu yazıp enter yapıyoruz.Bu işlem C klasörü içerisinde elektro-blogger.txt adı ve uzantısı ile bize dil paketlerimizi gösterecek. Txt dosyası içerisinde aşağıdakine yakın bir yazı bulacaksınız
Deployment Image Servicing and Management tool
Version: 6.3.9600.17031
Image Version: 6.3.9600.17031
Packages listing:
Package Identity : Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384
State : Installed
Release Type : Feature Pack
Install Time : 9.6.2014 03:24
Package Identity : Microsoft-Windows-Branding-CoreConnectedSingleLanguage-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384
State : Installed
Release Type : Language Pack
Install Time : 18.3.2014 09:38
Kırmızı ile belirttiğimiz alanı kopyalayalım daha sonrasında ingilizce dil paketini kaldırmak için bize gerekli olacak.
32 Bit - 64 Bit işletim sistemimize göre yandaki türkçe dil paketlerinden birini indirelim
İçinden çıkan lp.cab uzantılı dosyayı C klasörü içerisine koyalım sonrasında ise cmd komut penceresine
dism /Online /Add-Package /PackagePath:C:\lp.cab
Komutunu girelim
Bu kısım biraz uzun sürecektir.Yükleme tamamlandıktan sonra sıra geldi ingilizce dil paketini kaldırmaya
Yukarıda kırmızı olarak belirtilen sizdeki ingilizce dil paketi karşılığını kopyalayım
Sonrasında ise Cmd komut satırımıza
dism /Online /Remove-Package /PackageName:Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384
Burada dikkat etmenize gereken Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~6.3.9600.16384 satırının sizin txt dosyası içerisinde kopyaladığınız kısım olması
Bu işlemde biraz uzun sürecektir.İşlem tamamlandıktan sonra ise size sistemi tekrar başlatmak istediğini söyleyecektir.Sistem tekrar başladığında ise artık türkçe olarak kullanabileceksiniz.
Apple News Format for Publishers.Articles with substance. And style.
With the Apple News Format, News enables publishers to create unique and immersive editorial layouts with custom typography and rich multimedia, and to place that content in front of millions of readers.Now more noteworthy.
The Notes app has always been great for jotting down your thoughts. And now it’s great for so much more. Want an easy way to make a checklist ofto-dos? Consider it done. Or add a photo, map, or web link to a note. You can even draw a sketch with your finger. And thanks to iCloud, changes to your notes will be updated across all your devices and on iCloud.com. So you’ll always have your latest notes in hand.Add to your notes. From whatever app you’re in.
Tap the Share button in Safari, Maps, and lots of other apps to save attachments — maps, links, Pages documents, and more — to a new or existing note. Can’t remember which note you added something to? The Attachments Browser organizes all the items attached to your notes in one simple view, so it’s easy to find what you’re looking for.
All your notes across all your devices.
Notes works with iCloud so you can access your notes no matter which device you’re using. Create a shopping list on your Mac and then check off items at the store on your iPhone. All your changes are updated in real time.Get around. And see what’s around.
Now you can use public transportation with Maps as your guide. In select cities around the world, a new Transit view shows you lines and stations for subways, buses, trains, and ferries right on the map. When you plan a route, every step of your trip is laid out from point A to point B. And with the Nearby feature, it’s easier to see what’s around you and decide on places to shop, eat, and more.Not all the projects offer the same transparency or open governance, but at a minimum, they all provide open source Linux or Android code (often both), full schematics and other documentation, and at least an attempt at forums or other community resources.
Some projects more clearly show the hand of a single manufacturer, while several triangulate between the community project, an arms-length semiconductor vendor backer, and one or more third-party manufacturers and/or distributors. This is the classic model that supports the BeagleBone Black, with BeagleBoard.org, Texas Instruments (TI), and CircuitCo, playing their respective roles.
One TI-based board, the CraneBoard, has faded off the list, as has the Samsung Exynos based Origenboard. Origenboard.org at least still shows some signs of life, but appears to have been upstaged by Hardkernel's Exynos-focused Odroid project. Meanwhile, the Igloo Community and its Snowball board has been shut down entirely, due in large part to the fact that its chip vendor and sponsor ST-Ericsson is moving toward dissolution. Snowball manufacturer Calao still has some of the Cortex-A9 boards left, however.
The only SoC manufacturers listed twice here are TI and Freescale, each represented by two different SoC models. The others each use a different processor and vendor, including Allwinner, Broadcom, Samsung, Via, and Xilinx SoCs. All these are ARM-based SoCs, but for the first time we also include an x86 board with the Atom-based Minnowboard from Intel-backed Minnowboard.org.
Common Features
Not surprisingly, more powerful processors are showing up in open source boards, including the Cortex-A15-based Samsung Exynos 5 Octa processor in the new Odroid-XU. Yet, the most popular boards continue to be modestly powered, under-$50 SBCs, in particular the Raspberry Pi Foundation's $35 Raspberry Pi and the $45 BeagleBone Black.
Low price isn't the only draw here. These projects' largely transparent, user-responsive operations, lack of overbearing corporate control, and investment in education and hobbyist efforts help create large vibrant communities of developers who create a cascade of openly shared code and designs. This in turn attracts new developers and makes it easier for them to get started with essentially free tech support.
Other open board trends include increasingly smaller PCB size. Most of the boards are about the size of a modern smartphone or phablet, and several are even smaller. Most now offer HDMI ports to keep up with the otherwise modestly appointed Raspberry Pi, although most offer micro-HDMI ports instead of the Pi's full-sized connection.
Sometimes there's a fine line between open source, community-backed SBCs and the more prevalent commercial SBCs that offer open source Linux -- and increasingly Android -- builds, and in many cases full schematics. Several of these pop up every month, as seen on embedded sites like LinuxGizmos, which also offers reports on most of our Top 10 community boards. But community counts, especially if you're not funded to build a commercial product with customers waiting with checks in hand.
There's also something of a gray area between community boards and open platform mini-PCs from companies like CompuLab, which have been left off our list. Several of our top 10 contenders now come with optional enclosures to create a de facto mini-PC, but they also offer board-only versions.
We've also left off boards where Linux plays a minor role, as in the interesting new Arduino Yun board, which runs Linux on a 400MHz MIPS processor, but limits it to controlling networking functionality. In addition, there are several new open source SBCs on the horizon that didn't make the list. These include the Xilinx Zynq-based Red Pitaya measurement and control board, which is still in Kickstarter mode.
Top 10 Open Source Boards
1. APC Rock -- $79, Via Technologies, 800MHz Cortex-A9 Wondermedia
4. Cubieboard 2 -- $59, Wang And Tom Development Ltd. (Allwinner), Cortex-A7 dual-core Allwinner A20
7. Odroid-XU -- $149/$169, Odroid Project (Hardkernel), Samsung Exynos 5410 Octa (8-core Big,Little Cortex-A15 and –A7)
Source : https://www.linux.com/