‏إظهار الرسائل ذات التسميات أردوينو. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات أردوينو. إظهار كافة الرسائل

الجمعة، 18 ديسمبر 2015

كيفية وضع وإنشاء مكتبة جديدة للأردوينو



السلام عليكم ورحمة الله تعالى وبركاته .

هل يظهر لك خطأ بالكود ناتج عن عدم  تفعيل مكتبه جديده اضفتها للاردينو؟ هذه المشكله التي طالما طرحت علي من قبل المتابعين ، وفي هذه التدوينه سيتم معرفة الطريقة الصحيحة لكيفية تثبيت مكتبة جديدة في الأردوينو . 



لنأخذ كمثال تفعيل  مكتبة "المترو" من مقالة المؤقتات الزمنية و التحكم اللحظي بمنافذ الأردوينو

بعد ان يتم تحميل المكتبه قم بفك ضغط الملف بعد الضغط على الزر الايمن للفأره على ايقونه الملف ثم إستخرج هنا .

نفتح الملف الناتج ونختار الملف الذي يفتح مباشره لملفات الcpp وh




اذا سننقل ملف Metro في هذا المثال 




نضعه في مسار مكتبات اردوينو 





ونغلق  واجهه الاردوينو , ثم نعيد فتح البرنامج وبذلك نكون قد فعّلنا المكتبه الجديده ويمكننا  التأكد من اختيار example من قائمه ملف

وهكذا يمكننا استخدام هذه المكتبه الجديده ضمن الكود



المصدر MBARK TiЭSTO Blog

المؤقتات الزمنية و التحكم اللحظي بمنافذ الأردوينو



السلام عليكم ورحمة الله تعالى وبركاته .

كيف تجعل منافذ الأردوينو أكثر إستجابة ؟؟ ذا السؤال الذي طالما يطرح علي في رسائل المتابعين على صفحتي الشخصية ، فهل يمكنني ذلك ؟؟ هل يمكنني ربط حساسات كثيرة مثل الالتراسونيك و الاشعة تحت الحمراء و المحركات مع  الأردوينو و جعلها تعمل بشكل واحد و بدون تأخير زمني ملحوظ ؟

في البداية يجب أن أشير إلى أن المتحكمات الأصغرية MCU برمجتها تعتمد على الأوامر السلمية Ladder أي تنفيذ البرامج يكون بالترتيب حسب موضع التعليمة بالكود , من الأعلى للأسفل , هناك استثناءات الأ وهي المقاطعات Interrupts و المؤقتات Timers.

لكن نرجع للسؤال الأهم ، هل يمكنهم كلهم العمل مع الأردوينو دون تأخير زمني ملحوظ ؟؟

 الجواب نعم

كيف ؟ هذا ما سنتعرف عليه سويا في  هذه التدوينة .

أبسط أوامر التأخير الزمني في الأردوينو هو delay هذا الأمر يسهل على المبتدئين معرفة معنى التأخير الزمني و كيفية تطبيقه على المداخل و المخارج .

كأبسط مثال , برنامج Blink الذي يطبق على الباعث الضوئي LED المربوط على المدخل D13 يضيء لثانية واحده و يطفى لثانية واحدة 



/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
  delay(1000); // wait for a second
  digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
  delay(1000); // wait for a second
}





هذا الأمر فيه عدة عيوب , منها أنه لا نستطيع عمل أي شيء خلال زمن التأخير , لا نستطيع مثلاً قراءة حالة مدخل معين خلال هذا الوقت او التحكم في حالة مدخل آخر , إلا بعد انتهاء زمن التأخير كما أن زمن التأخير لا يكون بالضبط بنفس القيمة المحددة , في المثل السابق التأخير الزمني هو 1000 ملي ثانية لكن فعلياً التأخير يزيد بقليل عن هذه القيمة , و اذا تم تشغيل هذا البرنامج لفترة طويلة سيكون واضحاً جداً ان التأخير الزمني بين عمليه الأنارة و الأطفاء تزيد عن 1000 ملي ثانية بوضوح تام ! 

الحل يكون باستخدام الأمر millis ففي الأردوينو يمكن تشغيل المؤقتات باستخدام هذا الأمر و ان يكون زمن الأضاءة و الأغلاق للباعث الضوئي LED بالضبط هو 1000ملي ثانية حتى و لو استمر البرنامج بالعمل لفترة طويلة , هذا رائع :)

هذا البرنامج مثال موجود ضمن ملفات الأردوينو يوضح طريقة العمل لهذا الأمر و بنفس مخرجات البرنامج السابق .


/* Blink without Delay
 
 Turns on and off a light emitting diode(LED) connected to a digital  
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.
 
 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.
 
 
 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 
 This example code is in the public domain.

 
 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to 
// set pin numbers:
const int ledPin = 13; // the number of the LED pin

// Variables will change:
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}


ممتاز هذا رائع , لكن لو اردنا عمل برامج معقدة سيكون وضع الكود بهذه الطريقة أمراً مربكاً للمبرمج , فالحل يكون بوجود مكتبة .

لحسن الحظ فالمهتمين بالأردوينو قاموا بكتابة عشرات المكتبات لتسهل على المستخدمين التعامل مع المداخل و المخارج بصورة سريعة و بدقة عالية , منها مكتبة  Metro .

هذه المكتبة تعتمد بشكل أساسي على الأمر millis و تسهل على المبرمج الحصول على برنامج يحتوي العديد من البرامج ذات تأخير زمني ثابت بين كل وظيفة و الأخرى .

اولاً يمكن تحميل المكتبة من هنا

أوامرها جداً سهلة و يمكن أن ترى عدة أمثلة مرفقه مع المكتبة .

مثلاً لو أردنا تشغيل 3 مداخل في الأردوينو بحيث يكون :

1)واحد منهم يعمل لأضاءة - اطفاء ضوء لمدة2000ملي ثانية 

2)يعمل كتعديل نبضي PWM بحيث يقوم بزيادة طول النبضة الفعالة  "زيادة توهج ال LED " مرة كل 10 ملي ثانية.

3) يعمل كمدخل قراءة لحساس تماثلي "مقاومة متغيرة" يقوم بالتحقق منها كل 200ملي ثانية و يزيد توهج LED مربوط على مدخل رقمي بتناسب طردي مع قيمة المقاومة المقروءة .

القطع المستخدمة في التجربة :

1) بطاقة أردوينو
2) مقاومة متغيرة Potentiometer
3) LED باعث ضوئي عدد 3
4)مقاومات عدد 3 "ان تكون قيمتها أقل من 1كيلو اوم"
5) اسلاك توصيل
6) Bread Board . 

المخطط :


البرنامج :

// Metro Library code 
//Written By : MBARK TiЭSTO 
//http://www.mbarktiesto.com
// 18/12/2015 
//....................................
#include <
Metro.h> // Include the Metro library
//first , Blink Led for 150ms
Metro LED_flasher = Metro(2000);
boolean LEDState=true;
//second , Increase dimming For Led by 1 each time
Metro PWM_Cycle = Metro(10);
int i=0;
int Factor=1; //or -1
// third , Read Potentiometer and control the bright
//of led connect to another PWM Pin 
Metro Sensor=Metro(200);

const int LED=13;
const int pwmPin=6;
const int sensorPin=A0;
const int pwmPin2=3;
void setup() {
  
// put your setup code here, to run once:
pinMode( LED ,OUTPUT);
pinMode( pwmPin ,OUTPUT);
pinMode( pwmPin2 ,OUTPUT);
pinMode( sensorPin ,INPUT);

}

void loop() {
  
// put your main code here, to run repeatedly:
   
if (LED_flasher.check() == 1) { // check if the metro has passed its interval .
  
digitalWrite(LED,LEDState);
  LEDState=!LEDState;
   }
  
if (PWM_Cycle.check() == 1) { // check if the metro has passed its interval .
   
analogWrite(pwmPin,i);
   
if(i==0){Factor=1;}
   
if(i>255){Factor=-1;}
   i+=Factor;
}
  
if (Sensor.check() == 1) { // check if the metro has passed its interval .
  
int SensorValue=analogRead(A0);
  
analogWrite(pwmPin2,SensorValue/4);
}
}

هذه أحدى الطرق لزيادة فاعلية برنامجك , حاول دائماً ان لا تستخدم ال delay بشكل كبير خصوصاً عندما تحتوي مشاريعك على العديد من القطع او التعليمات التي تحتاج دقة في الوقت .

المصدر MBARK TiЭSTO Blog

الجمعة، 4 ديسمبر 2015

أردوينو6#ARDUINO : كيف تنشئ جهاز كشف الدخان ببساطة شديدة



السلام عليكم ورحمة الله تعالى وبركاته .

مرحبا بكم في فيديو جديد من دورة و سلسلة فيديوهات أردوينو بشكل مبسط ، ومع مشروع جديد ومصطلح جديد ، في فيديو اليوم وهو الفيديو الخامس ، بإذن الله عز وجل سنرى ونتعلم وبطريقة بسيطة جدا ، كيف تنشئ جهاز كشف الدخان ببساطة شديدة بإستخدام الأردوينو وبعض الإضافات المتوفرة و البسيطة . إذن بدون أن أطيل عليكم أدعكم مع الفيديو والدرس و أتمنى من الله سبحانه وتعالى أن ينال الدرس إعجابكم .

عزيزي الزائر إذا أعجبك الفيديو فلا تبخل علي بلايك للفيديو وأن تشترك معي .


ملاحظة :

إذا لم تتوفر لديك المستلزمات المستخدمة ، يمكنك شراؤها من متجرنا الإلكتروني .

متحكم اردوينو ( UNO)  من هنا 

حساس ضوء LDR من هنا

 من هنا مصدر ضوء ليزر من هنا

لوحة تجارب مثقبة Breadboard من هنا

 طنـّـان كهربائي من هنا

 LEDs بعدة ألوان من هنا 






لتحميل الكود البرمجي المستخدم من هنا

الجمعة، 20 نوفمبر 2015

أردوينو5#ARDUINO : كيف تنشئ رادار خاص بك بإستخدام الأردوينو


السلام عليكم ورحمة الله تعالى وبركاته .

مرحبا بكم في فيديو جديد من دورة و سلسلة فيديوهات أردوينو بشكل مبسط ، ومع مشروع جديد ومصطلح جديد ، في فيديو اليوم وهو الفيديو الخامس ، بإذن الله عز وجل سنرى ونتعلم وبطريقة بسيطة جدا ، كيف تنشئ رادار خاص بك ، بإستخدام الأردوينو وبعض الإضافات المتوفرة و البسيطة . إذن بدون أن أطيل عليكم أدعكم مع الفيديو والدرس و أتمنى من الله سبحانه وتعالى أن ينال الدرس إعجابكم .

عزيزي الزائر إذا أعجبك الفيديو فلا تبخل علي بلايك للفيديو وأن تشترك معي .



 

يمكنك شراء المستلزمات من متجرنا الإلكتروني ، بأثمنة جد مناسبة ، وتصل لعنوانك الذي طلبت في مدة قصيرة .

بوردة أردوينو Arduino من هنا
محرك سيرفو Servo من هنا
حساس إلتراسونيك Ultrasonic من هنا
لوحة تجارب مثقبة Bread Board من هنا
                                                                                                                                                الشكل الأول :


__________ كود الاردوينو __________

#include <Servo.h>            // include the standard servo library
Servo leftRightServo; // set a variable to map the servo
int leftRightPos = 0; // set a variable to store the servo position
const int numReadings = 10; // set a variable for the number of readings to take
int index = 0; // the index of the current reading
int total = 0; // the total of all readings
int average = 0; // the average
int echoPin = 7; // the SRF05's echo pin
int initPin = 8; // the SRF05's init pin
unsigned long pulseTime = 0; // variable for reading the pulse
unsigned long distance = 0; // variable for storing distance
 
/* setup the pins, servo and serial port */
void setup() {
leftRightServo.attach(9);
// make the init pin an output:
pinMode(initPin, OUTPUT);
// make the echo pin an input:
pinMode(echoPin, INPUT);
// initialize the serial port:
Serial.begin(9600);
}
 
/* begin rotating the servo and getting sensor values */
void loop() {
for(leftRightPos = 0; leftRightPos < 180; leftRightPos++) { // going left to right.
leftRightServo.write(leftRightPos);
for (index = 0; index<=numReadings;index++) { // take x number of readings from the sensor and average them
digitalWrite(initPin, LOW);
delayMicroseconds(50);
digitalWrite(initPin, HIGH); // send signal
delayMicroseconds(50); // wait 50 microseconds for it to return
digitalWrite(initPin, LOW); // close signal
pulseTime = pulseIn(echoPin, HIGH); // calculate time for signal to return
distance = pulseTime/58; // convert to centimetres
total = total + distance; // update total
delay(10);
}
average = total/numReadings; // create average reading
 
if (index >= numReadings) { // reset the counts when at the last item of the array
index = 0;
total = 0;
}
Serial.print("X"); // print leading X to mark the following value as degrees
Serial.print(leftRightPos); // current servo position
Serial.print("V"); // preceeding character to separate values
Serial.println(average); // average of sensor readings
}
/*
start going right to left after we got to 180 degrees
same code as above
*/
for(leftRightPos = 180; leftRightPos > 0; leftRightPos--) { // going right to left
leftRightServo.write(leftRightPos);
for (index = 0; index<=numReadings;index++) {
digitalWrite(initPin, LOW);
delayMicroseconds(50);
digitalWrite(initPin, HIGH);
delayMicroseconds(50);
digitalWrite(initPin, LOW);
pulseTime = pulseIn(echoPin, HIGH);
distance = pulseTime/58;
total = total + distance;
delay(10);
}
average = total/numReadings;
if (index >= numReadings) {
index = 0;
total = 0;
}
Serial.print("X");
Serial.print(leftRightPos);
Serial.print("V");
Serial.println(average);
}
}

_______  processing code ________
import processing.serial.*;     // import serial library
Serial myPort; // declare a serial port
float x, y; // variable to store x and y co-ordinates for vertices
int radius = 350; // set the radius of objects
int w = 300; // set an arbitary width value
int degree = 0; // servo position in degrees
int value = 0; // value from sensor
int motion = 0; // value to store which way the servo is panning
int[] newValue = new int[181]; // create an array to store each new sensor value for each servo position
int[] oldValue = new int[181]; // create an array to store the previous values.
PFont myFont; // setup fonts in Processing
int radarDist = 0; // set value to configure Radar distance labels
int firstRun = 0; // value to ignore triggering motion on the first 2 servo sweeps

/* create background and serial buffer */
void setup(){
// setup the background size, colour and font.
size(750, 450);
background (0); // 0 = black
myFont = createFont("verdana", 12);
textFont(myFont);
// setup the serial port and buffer
myPort = new Serial(this, Serial.list()[1], 9600);
myPort.bufferUntil('n');
}

/* draw the screen */
void draw(){
fill(0); // set the following shapes to be black
noStroke(); // set the following shapes to have no outline
ellipse(radius, radius, 750, 750); // draw a circle with a width/ height = 750 with its center position (x and y) set by the radius
rectMode(CENTER); // set the following rectangle to be drawn around its center
rect(350,402,800,100); // draw rectangle (x, y, width, height)
if (degree >= 179) { // if at the far right then set motion = 1/ true we're about to go right to left
motion = 1; // this changes the animation to run right to left
}
if (degree <= 1) { // if servo at 0 degrees then we're about to go left to right
motion = 0; // this sets the animation to run left to right
}
/* setup the radar sweep */
/*
We use trigonmetry to create points around a circle.
So the radius plus the cosine of the servo position converted to radians
Since radians 0 start at 90 degrees we add 180 to make it start from the left
Adding +1 (i) each time through the loops to move 1 degree matching the one degree of servo movement
cos is for the x left to right value and sin calculates the y value
since its a circle we plot our lines and vertices around the start point for everything will always be the center.
*/
strokeWeight(7); // set the thickness of the lines
if (motion == 0) { // if going left to right
for (int i = 0; i <= 20; i++) { // draw 20 lines with fading colour each 1 degree further round than the last
stroke(0, (10*i), 0); // set the stroke colour (Red, Green, Blue) base it on the the value of i
line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w); // line(start x, start y, end x, end y)
}
} else { // if going right to left
for (int i = 20; i >= 0; i--) { // draw 20 lines with fading colour
stroke(0,200-(10*i), 0); // using standard RGB values, each between 0 and 255
line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w);
}
}
/* Setup the shapes made from the sensor values */
noStroke(); // no outline
/* first sweep */
fill(0,50,0); // set the fill colour of the shape (Red, Green, Blue)
beginShape(); // start drawing shape
for (int i = 0; i < 180; i++) { // for each degree in the array
x = radius + cos(radians((180+i)))*((oldValue[i])); // create x coordinate
y = radius + sin(radians((180+i)))*((oldValue[i])); // create y coordinate
vertex(x, y); // plot vertices
}
endShape(); // end shape
/* second sweep */
fill(0,110,0);
beginShape();
for (int i = 0; i < 180; i++) {
x = radius + cos(radians((180+i)))*(newValue[i]);
y = radius + sin(radians((180+i)))*(newValue[i]);
vertex(x, y);
}
endShape();
/* average */
fill(0,170,0);
beginShape();
for (int i = 0; i < 180; i++) {
x = radius + cos(radians((180+i)))*((newValue[i]+oldValue[i])/2); // create average
y = radius + sin(radians((180+i)))*((newValue[i]+oldValue[i])/2);
vertex(x, y);
}
endShape();
/* if after first 2 sweeps, highlight motion with red circle*/
if (firstRun >= 360) {
stroke(150,0,0);
strokeWeight(1);
noFill();
for (int i = 0; i < 180; i++) {
if (oldValue[i] - newValue[i] > 35 || newValue[i] - oldValue[i] > 35) {
x = radius + cos(radians((180+i)))*(newValue[i]);
y = radius + sin(radians((180+i)))*(newValue[i]);
ellipse(x, y, 10, 10);
}
}
}
/* set the radar distance rings and out put their values, 50, 100, 150 etc.. */
for (int i = 0; i <=6; i++){
noFill();
strokeWeight(1);
stroke(0, 255-(30*i), 0);
ellipse(radius, radius, (100*i), (100*i));
fill(0, 100, 0);
noStroke();
text(Integer.toString(radarDist+50), 380, (305-radarDist), 50, 50);
radarDist+=50;
}
radarDist = 0;
/* draw the grid lines on the radar every 30 degrees and write their values 180, 210, 240 etc.. */
for (int i = 0; i <= 6; i++) {
strokeWeight(1);
stroke(0, 55, 0);
line(radius, radius, radius + cos(radians(180+(30*i)))*w, radius + sin(radians(180+(30*i)))*w);
fill(0, 55, 0);
noStroke();
if (180+(30*i) >= 300) {
text(Integer.toString(180+(30*i)), (radius+10) + cos(radians(180+(30*i)))*(w+10), (radius+10) + sin(radians(180+(30*i)))*(w+10), 25,50);
} else {
text(Integer.toString(180+(30*i)), radius + cos(radians(180+(30*i)))*w, radius + sin(radians(180+(30*i)))*w, 60,40);
}
}
/* Write information text and values. */
noStroke();
fill(0);
rect(350,402,800,100);
fill(0, 100, 0);
text("Degrees: "+Integer.toString(degree), 100, 380, 100, 50); // use Integet.toString to convert numeric to string as text() only outputs strings
text("Distance: "+Integer.toString(value), 100, 400, 100, 50); // text(string, x, y, width, height)
text("Radar screen code at ali-madness.blogspot.com", 540, 380, 250, 50);
fill(0);
rect(70,60,150,100);
fill(0, 100, 0);
text("Screen Key:", 100, 50, 150, 50);
fill(0,50,0);
rect(30,53,10,10);
text("First sweep", 115, 70, 150, 50);
fill(0,110,0);
rect(30,73,10,10);
text("Second sweep", 115, 90, 150, 50);
fill(0,170,0);
rect(30,93,10,10);
text("Average", 115, 110, 150, 50);
noFill();
stroke(150,0,0);
strokeWeight(1);
ellipse(29, 113, 10, 10);
fill(150,0,0);
text("Motion", 115, 130, 150, 50);
}

/* get values from serial port */
void serialEvent (Serial myPort) {
String xString = myPort.readStringUntil('n'); // read the serial port until a new line
if (xString != null) { // if theres data in between the new lines
xString = trim(xString); // get rid of any whitespace just in case
String getX = xString.substring(1, xString.indexOf("V")); // get the value of the servo position
String getV = xString.substring(xString.indexOf("V")+1, xString.length()); // get the value of the sensor reading
degree = Integer.parseInt(getX); // set the values to variables
value = Integer.parseInt(getV);
oldValue[degree] = newValue[degree]; // store the values in the arrays.
newValue[degree] = value;
/* sets a counter to allow for the first 2 sweeps of the servo */
firstRun++;
if (firstRun > 360) {
firstRun = 360; // keep the value at 360
}
}
}
                                                                                                                                                        الشكل  الثاني  :


__________ كود الاردوينو __________
#include <Servo.h> 


Servo servo1;

static const int minAngle = 0;
static const int maxAngle = 180;
int servoAngle;
int servoPos;
int servoPin = 9;



#define echoPin 7
#define trigPin 8
#define LEDPin 13
long duration;
long HR_dist=0;
int HR_angle=0;
int HR_dir=1;
int minimumRange=2;
int maximumRange=500;

/*--------------------SETUP()------------------------*/
void setup() {

Serial.begin (9600);

servo1.attach(servoPin);

pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT);
}

/*----------------------LOOP()--------------------------*/
void loop() {

if (Serial.available()) {

HR_angle = Serial.parseInt();

if(HR_angle>-1){

servoPos = constrain(map(HR_angle, 0,180,minAngle,maxAngle),minAngle,maxAngle);
servo1.write(servoPos);

getDistance();
}
}
}

/*--------------------getDistance() FUNCTION ---------------*/
void getDistance(){

digitalWrite(trigPin, LOW);
delayMicroseconds(2);

digitalWrite(trigPin, HIGH);
delayMicroseconds(10);

digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

HR_dist = duration/58.2;

if (HR_dist >= maximumRange || HR_dist <= minimumRange){

Serial.println("0");
digitalWrite(LEDPin, HIGH);
} else {

Serial.println(HR_dist);
digitalWrite(LEDPin, LOW);
}
}
_______  processing code ________
import processing.serial.*;

int distance;
int angle=0;
int direction=1;

int[] alphaVal = new int[100];
int[] distance2 = new int[100];
int lineSize = 4;

String comPortString;
Serial comPort;

/*---------------------SETUP---------------------------*/
void setup( ) {
size(displayWidth,displayHeight);
smooth();
background(0);


comPort = new Serial(this, "COM9", 9600); // ضع رقم المنفذ الموصول مع الاردوينو ••••
comPort.bufferUntil('\n');

for(int i=0; i<91; i++){
alphaVal[i] = 0;
}
}

/*---------------------DRAW-----------------*/
void draw( ) {
background(0);

for(int i=0; i<91; i++){

alphaVal[i]=alphaVal[i]-4;

if(alphaVal[i]<0){
alphaVal[i]=0;
}

stroke(255,distance2[i],0,alphaVal[i]);

strokeWeight(2);
line(width/2, height, (width/2)-cos(radians(i*2))*(distance2[i]*lineSize), height-sin(radians(i*2))*(distance2[i]*lineSize));

stroke(255);
strokeWeight(1);
ellipse((width/2)-cos(radians(i*2))*(distance2[i]*lineSize), height-sin(radians(i*2))*(distance2[i]*lineSize),5,5);
}
}

void mousePressed(){
sendAngle();
}

void serialEvent(Serial cPort){
comPortString = cPort.readStringUntil('\n');
if(comPortString != null) {
comPortString=trim(comPortString);

distance = int(map(Integer.parseInt(comPortString),1,200,1,height));
drawSonar(angle,distance);

sendAngle();
}
}

/*---------------------------sendAngle() FUNCTION----------------*/
void sendAngle(){
comPort.write(angle+".");

angle=angle+(2*direction);
if(angle>178||angle<1){
direction=direction*-1;
}
}

/*-----------------sketchFullScreen(): Allows for FullScreen view------*/
boolean sketchFullScreen() {
return true;
}

/*----------------- drawSonar(): update the line/dot positions---------*/
void drawSonar(int sonAngle, int newDist){
alphaVal[sonAngle/2] = 180;
distance2[sonAngle/2] = newDist;
}

الاثنين، 31 أغسطس 2015

دليل + تجربتي لشراء المكونات اﻹلكترونية "للأردوينو" من الصين بأقل سعر



السلام عليكم ورحمة الله وبركاته .

هناك أزمة عامة في الوطن العربي وهي عدم توفر القطع الإلكترونية بصورة كافية خاصة أن المحلات الموجودة في معظم الدول توفر القطع اﻹلكترونية المتعلقة بصيانة الأجهزة الكهربية المشهورة فقط ولا تلبي جميع احتياجات هواة الإلكترونيات.
محاولاتي الكثيرة والفاشلة في الحصول على مكونات إلكترونية خاصة ببردات الأردوينو في المغرب ، تبا وجدت فقد بردات قديمة و باهظة الثمن + المقاومات لم تكن تلك التي أريد وهذا يؤكد لنا غياب الإهتمام بمجالات الإبداع ، المهم بحثث في عديد من المدن المغربية المعروفة وبدون جدوى لم أجد ما أريد . فقررت أن أذهب إلى العملاق،،،،، الصين.

الاستيراد من الصين عملية سهلة وليست معقدة كما يعتقد الجميع، وأجمل شئ هو السعر فائق الانخفاض والذي غالباً يكون 25% إلى 10% من سعر السوق المحلي (هذا يعني انك ستوفر من 70% الى 90% من سعر السلعة).
في هذا المقال سأشرح الخطوات التي يجب عليك اتباعها لشراء أي قطع إلكترونية أو اي منتج من الصين، مع العلم أنني اسكن في المغرب لذلك هذا المقال سيكون لكل قاطني المغرب خصوصا  (مع العلم أن جميع الخطوات تصلح لكل البلاد العربية بلا استثناء).

المتطلبات:

1- بطاقة دفع عبر الانترنت مثل Visa Internet or Master Card

2- عنوان ثابت للشحن

3- رقم هاتف (جوال أو هاتف أرضي)  خاص بك

بالنسبة لبطاقة بنكية أنصحك خصوصا إذا كنتم في المغرب والجزائر و تونس أن تستخدمو حساباتك البنكية للشراء ، أو هناك حل أخر إذا كان لديك حساب بايبال فيه أموال يمكنك الشراء حتى وإن لم يكن مفعلا لكن هنا ستظطر لتغيير الموقع الذي سأشرحه اليوم وأنصحك في هذه الحالة بموقع (Gear Best)

يمكنك اﻵن الشراء من المتاجر الصينية المتوفرة عبر الإنترنت واليك أفضل متجرين في رأيي الشخصي:

                                                  Ali Express



                                                 Deal Extreme



كلا الموقعين يقدمان خدمات ممتازة ولقد جربت الشراء من كلاهما، ما يميز deal extreme هو أن جميع المنتجات تأتي بشحن مجاني دون أي رسوم إضافيه، بينما يوفر موقع ali express المنتجات بصورة أرخص (أغلب هذه المكونات تكون مع شحن مجاني وبعضها يكون برسوم شحن زهيدة جداً مثل 1 او 2 دولار).

شخصياً أفضل Ali express لان يقدم ضمان لاسترداد المال في حالة ضياع او فقدان المنتج ويوجد به نظام لقياس مدى رضاء العميل شامل استرداد المال اذا لم يعجبك المنتج كما أنه يحتوي على مجموعة ضخمة جداً من المنتجات في كل المجالات تقريباً (لا يمكن مقارنة حجم المنتجات الموجود به بموقع dx.com حيث يتفوق Ali express بفارق واضح).

أيضاً يتوفق Ali Express في زمن الشحن، عندما اشتريت المقاومات استغرق الامر اسبوعين حتى وصلت المغرب ، و 5 ايام حتى وصلت الى مركز البريد بمدينة تارودانت  (اجمالي 20 يوم) وعندما جربت dx.com استغرق اﻷمر نحو 35 يوم تقريباً.

ابدأ الشراء

قم بالاشتراك في الموقع وسجل جميع بياناتك بصورة صحيحة خاصة الاسم وعنوان الشحن (لاحظ أنه عند استلام المنتجات سيطلب منك البطاقة الشخصية ويجب أن تكون البيانات المكتوبة عليها مطابقة للعنوان المطبوع على الطرد القادم من موقع Ali Express).

بعد الانتهاء من كتابة كافة البيانات يمكنك اﻵن شراء أي مكونات تريدها، فمثلا لنبحث عن المقاومات Surface mount والتي تكتب SMD Resistors في مربع البحث.


لاحظ انه يوجد مجموعة من المربعات في الشريط العلوي لاختيار طريقة ترتيب النتائج مثل السعر (الأقل ثم اﻷعلى) أو عدد الطلباتOrders من هذا المتجر (هذا التصنيف يوضح مدى شهرة و موثوقيه المتجر الذي يبيع هذه المكونات ويعتبر افضل طريقة لاختيار الشخص الذي تريد الشراء منه)، وهناك تصنيف عدد التقييم من الزبائن Rating

أنصحك أن تقوم بترتيب النتائج دائما عن طريق كمية ال orders او التقييم Rating وبذلك تصلح على أفضل التجار (غالباً ما يكونو هم من يقدمون المنتج بأفضل سعر أيضاً).


كما نرى في الصورة السابقة أحد المتاجر الذي يقدم الـ Surface mount Resistor لديه عرض رائع بقيمة 6 دولار مقابل 2000 مقاومة بقيم مختلفة، لاحظ أنه في الجزء الاخير من الصفحة نجد أن البائع يدخل ضمن

Buyer Protection

Full Refund if you don’t receive your order

Refund or Keep items not as described

هذا يعني انه في حالة عدم استلام البضاعة او انها مختلفة عن المعروض يمكنك استرداد المال الذي دفعته، أيضاً لاحظ الجانب الايمن من الشاشة حيث نجد

Sold By

Ace Wong’s store

China

1170

99.9% Positive feedback

--------------------------------------------------------------------------------------

السطر اﻷول : اسم المتجر Ace Wong Store

السطر الثاني: البلد المنتجة China

السطر الثالث: عدد الزبائن الذين قامو بتقييم هذا المتجر 1170 شخص

السطر الرابع: مدى رضى الزبائن عن هذا المتجر والذي يبدو أنه مرضي للغاية ليحصل على 99.9% :)

ايضاً يوجد زر Visit Store لزيارة هذا المتجر وتصفح جميع المنتجات الذي يعرضها للبيع.

تتبع المنتج حتى يصل من الصين الى بلدك: 

بعد البحث عن القطع اﻹلكترونية التي ترغب بها ومقارنة الاسعار قم بشراء القطع ويتم الدفع عبر ادخال رقم الفيزا او الماستر كارد حيث يتم خصم قيمة المال المطلوب مباشرة ويتم اعطائك كود خاص لتتبع هذه الشحنة. مثل الموجود في الصورة التالية:



كما نرى من الصورة أصبح لدينا رقم لتتبع الشحنة، بهذا الرقم يمكن معرفة مكان الطرد الذي يحتوي على ما طلبناة، ويمكن معرفة هذا المكان عبر الموقع التالي :  من هنا

و أخيرا الوصول 



واﻵن يبدو أن لدي مخزون كافي من المقاومات.

الجمعة، 26 ديسمبر 2014

الأردوينو Arduino (الجزء الرابع) كيف تقوم ببرمجة الأردوينو على الكالي لينكس



السلام عليكم و رحمة الله .

اليوم بإذنه تبارك و تعالى نتمم في الجزء الرابع  من دروس تعلم مبادئ الأردوينو ، وفي هذا الجزء سنتحذث عنكيف تطور أو تبرمج بيئة أردوينو على كالي لينكس ، يمكنك دائما الرجوع للأجزاء السابقة لمتابعتها وتعرف عن ماذا نتحدث ، إدن بدون أن أطيل عليكم أدعكم مع الفيديو الذي أتمنى أن ينال عجابكم .

عزيزي الزائر إذا أعجبك الفيديو فلا تبخل علي بلايك له و أن تشترك معي في القناة 

الـــــشـــــرح


لمتابعة باقي الأجزاء من هنا