<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>&#8235;לירטקס - טכנולוגיה בקצה הזמן&#8236;</title> <atom:link href="http://www.lirtex.com/he/feed/" rel="self" type="application/rss+xml" /><link>http://www.lirtex.com/he</link> <description>&#8235;חומרה, תוכנה ומה שבניהם&#8236;</description> <lastBuildDate>Wed, 06 Oct 2010 21:48:01 +0000</lastBuildDate> <language>he</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>&#8235;ראייה ממוחשבת &#8211; זיהוי ומעקב מהיר אחר אובייקט&#8236;</title><link>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a8%d7%90%d7%99%d7%99%d7%94-%d7%9e%d7%9e%d7%95%d7%97%d7%a9%d7%91%d7%aa-%d7%9e%d7%a2%d7%a7%d7%91-%d7%90%d7%97%d7%a8-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/</link> <comments>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a8%d7%90%d7%99%d7%99%d7%94-%d7%9e%d7%9e%d7%95%d7%97%d7%a9%d7%91%d7%aa-%d7%9e%d7%a2%d7%a7%d7%91-%d7%90%d7%97%d7%a8-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/#comments</comments> <pubDate>Sun, 26 Sep 2010 16:52:06 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[רובוטיקה]]></category> <category><![CDATA[Embedded Linux]]></category> <category><![CDATA[מנוע סרוו]]></category> <category><![CDATA[מצלמה]]></category> <category><![CDATA[משובץ לינוקס]]></category> <category><![CDATA[עיבוד תמונה]]></category> <category><![CDATA[ראייה ממוחשבת]]></category> <category><![CDATA[רובוט]]></category><guid isPermaLink="false">http://www.lirtex.com/he/?p=144</guid> <description><![CDATA[&#8235;בפוסט זה אתאר תהליך הוספת אלמטים של ראייה ממוחשבת לפלטפורמה הרובוטית שבניתי. רציתי לאפשר לרובוט לבצע שני דברים. הראשון הוא מעקב של הרובוט אחרי אוביקט, לצורך העניין כדור, עם מצלמת הראש שלו. מצלמת הראש מותקנת על מערכת Pan-Tilt מבוססת מנועי סרוו שמאפשרת למצלמה לנוע ימינה, שמאלה, למעלה ולמטה, כמו שניתן לראות בתמונה. מעקב אחרי האוביקט [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p style="text-align: right;">בפוסט זה אתאר תהליך הוספת אלמטים של ראייה ממוחשבת ל<a href="http://www.lirtex.com/he/%D7%A8%D7%95%D7%91%D7%95%D7%98%D7%99%D7%A7%D7%94/%D7%A4%D7%9C%D7%98%D7%A4%D7%95%D7%A8%D7%9E%D7%94-%D7%A8%D7%95%D7%91%D7%95%D7%98%D7%99%D7%AA-%D7%A8%D7%95%D7%91%D7%95%D7%98-%D7%97%D7%9B%D7%9D/">פלטפורמה הרובוטית</a> שבניתי. רציתי לאפשר לרובוט לבצע שני דברים. הראשון הוא מעקב של הרובוט אחרי אוביקט, לצורך העניין כדור, עם מצלמת הראש שלו. מצלמת הראש מותקנת על מערכת  Pan-Tilt מבוססת מנועי סרוו שמאפשרת למצלמה לנוע ימינה, שמאלה, למעלה ולמטה, כמו שניתן לראות בתמונה. מעקב אחרי האוביקט עם מצלמת הראש הוא הזזת המצלמה בהתאם למיקום הכדור.</p><p style="text-align: right;"><p style="text-align: right;"><a href="http://www.lirtex.com/wp-content/uploads/2010/09/Robot-Front-Camera-mounted-on-a-head-tilt-servo-system.jpg" rel="lightbox[144]" title="Robot Front Camera mounted on a head tilt servo system"><img class="size-medium wp-image-203  aligncenter" title="Robot Front Camera mounted on a head tilt servo system" src="http://www.lirtex.com/wp-content/uploads/2010/09/Robot-Front-Camera-mounted-on-a-head-tilt-servo-system-300x288.jpg" alt="" width="300" height="288" /></a></p><p style="text-align: right;">המטרה השניה והיותר מורכבת היא שימוש ביכולות המעקב של המצלמה יכולות ראייה ממוחשבת נוספות, על מנת לאפשר לרובוט כולו לרדוף אחרי כדור מושלך, בדומה למשחק עם כלב.</p><p style="text-align: right;"><span id="more-144"></span></p><p style="text-align: right;"><p style="text-align: right;"><h2 style="text-align: right;">מימוש</h2><p>כדי לממש את יכולות הראייה הממוחשבת של הרובוט השתמשתי במספר אלגוריתמי  עיבוד תמונה וראייה ממוחשבת בסיסיים. השתמשתי בספריית <a href="http://he.wikipedia.org/wiki/OpenCV" target="_blank">OpenCV</a> &#8211; ספריית ראייה ממוחשבת בעלת קוד פתוח, שפותחה במקור על ידי אינטל. הספרייה היא Cross Platform (השתמשתי בה גם ב-PC וגם בלוחות מבוססי ARM כדוגמת ה-<a href="http://www.lirtex.com/he/embedded/%D7%91%D7%97%D7%99%D7%A8%D7%AA-%D7%9C%D7%95%D7%97-%D7%A4%D7%99%D7%AA%D7%95%D7%97-%D7%9E%D7%A9%D7%95%D7%91%D7%A5-%D7%9C%D7%99%D7%A0%D7%95%D7%A7%D7%A1-embedded-linux/">Beagleboard</a>). ספריית OpenCV נוחה לשימוש לבעלי רקע וקצת נסיון עם עיבוד תמונה.</p><p>כאמור, האוביקט הראשון שרציתי ללמד את הרובוט לזהות הוא כדור פשוט בצבע כתום.</p><p style="text-align: right;"><a href="http://www.lirtex.com/wp-content/uploads/2010/09/Object-Tracking-Orange-Ball1.jpg" rel="lightbox[144]" title="Object-Tracking-Orange-Ball"><img class="size-thumbnail wp-image-216 alignnone" title="Object-Tracking-Orange-Ball" src="http://www.lirtex.com/wp-content/uploads/2010/09/Object-Tracking-Orange-Ball1-150x150.jpg" alt="" width="150" height="150" /></a></p><h3 style="text-align: right;">מעקב מבוסס צבע</h3><p>מעקב מבוסס צבע מומלץ לשמוש כאשר ניתן להפריד צבע אחד משאר צבעי הרקע בתמונה &#8211; לדוגמה, כדור בצבע כתום בחדר עם קירות לבנים, אריחי רצפה לבנים וכו'. סינון שאר הצבעים מהתמונה, והשארת הצבע הכתום בלבד הוא תהליך מהיר מאד שמאיץ את אלגוריתמי עיבוד התמונה שיורצו בשלב מאוחר יותר, ולכן הוא מומלץ כפילטר ראשוני. אגב, ניתן לומר ששלט Wii משתמש גם הוא ביהוי מבוסס צבע למציאה מהירה של מיקום השלט (שם &quot;הצבע&quot; שבשימוש הוא גלי אור אינפרא-אדומים).</p><p>כדי לפלטר ולהשאיר בתמונה רק את הצבעים הכתומים, העברתי את התמונה ל<a href="http://en.wikipedia.org/wiki/HSL_and_HSV" target="_blank">מרחב צבע HSV</a>, ולאחר מכן השתמשתי בפילטר cvInRange כדי להותיר רק את טווח הצבעים הכתום. בתמונות למטה ניתן לראות את התמונה לאחר מעבר למרחב הצבע HSV, ולאחר מכן לאחר הרצת פילטר הצבע והמרה לשחור-לבן (כאשר לבן מיצג צבע כתום בתמונה המקורית ושחור את <strong>כל</strong> שאר הצבעים).</p><p style="text-align: right;"><strong><a href="http://www.lirtex.com/wp-content/uploads/2010/09/FastObjectTracking-process-HSV.jpg" rel="lightbox[144]" title="Fast Object Tracking HSV color conversion"><img class="size-medium wp-image-244 alignnone" title="Fast Object Tracking HSV color conversion" src="http://www.lirtex.com/wp-content/uploads/2010/09/FastObjectTracking-process-HSV-300x238.jpg" alt="" width="300" height="238" /></a><a href="http://www.lirtex.com/wp-content/uploads/2010/09/FastObjectTracking-process-Color-Filtering.jpg" rel="lightbox[144]" title="Fast Object Tracking Color Filtering"><img class="size-medium wp-image-245 alignnone" title="Fast Object Tracking Color Filtering" src="http://www.lirtex.com/wp-content/uploads/2010/09/FastObjectTracking-process-Color-Filtering-300x239.jpg" alt="" width="300" height="239" /></a></strong></p><p style="text-align: right;">להלן הקוד ב-Python הרלוונטי:</p><pre class="brush: python; title: ; notranslate">

#declare necessary objects

hsv_frame = cvCreateImage(size, IPL_DEPTH_8U, 3)
thresholded = cvCreateImage(size, IPL_DEPTH_8U, 1)
thresholded2 = cvCreateImage(size, IPL_DEPTH_8U, 1)
hsv_min = cvScalar(0, 50, 170, 0)
hsv_max = cvScalar(10, 180, 256, 0)
hsv_min2 = cvScalar(170, 50, 170, 0)
hsv_max2 = cvScalar(256, 180, 256, 0)

# convert to HSV for color matching
# as hue wraps around, we need to match it in 2 parts and OR together
cvCvtColor(frame, hsv_frame, CV_BGR2HSV)
cvInRangeS(hsv_frame, hsv_min, hsv_max, thresholded)
cvInRangeS(hsv_frame, hsv_min2, hsv_max2, thresholded2)
cvOr(thresholded, thresholded2, thresholded)
</pre><h3>זיהוי אוביקט מבוסס צורה</h3><p>כמובן, שזיהוי מבוסס צבע לא מספיק ויכול לשמש רק כשלב ראשוני באלגוריתם לזיהוי צורה. למשל במקרה שבו אדם לובש חולצה כתומה לא נרצה שהרובוט יעקוב אחרי האדם (למרות שזה יכול להיות ניסוי די מעניין <img src='http://www.lirtex.com/he/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). לכן השלב הבא הוא זיהוי צורה ספציפית, ובמקרה הזה עיגול (היצוג הדו ממדי של הכדור). לשם כך השתמשתי ב<a href="http://en.wikipedia.org/wiki/Hough_transform" target="_blank">התמרת Hough</a>, התמרה מתמטית שבסיסה זיהוי אוביקטים המתאימים למשוואה המתימטית שמיצגת אותם. לפני השימוש בהתמרת Hough הפעלתי פילטר ריכוך לתמונה, שמנסיוני מטייב את התוצאות של התמרת Hough. <a href="http://www.lirtex.com/wp-content/uploads/2010/09/FastObjectTracking-process-Original-and-detected-object.jpg" rel="lightbox[144]" title="Fast Object Tracking original stream with detected object overlay"><img class="size-medium wp-image-247 aligncenter" title="Fast Object Tracking original stream with detected object overlay" src="http://www.lirtex.com/wp-content/uploads/2010/09/FastObjectTracking-process-Original-and-detected-object-300x240.jpg" alt="" width="300" height="240" /></a></p><p>להלן הקוד, ב-Python.</p><pre class="brush: python; title: ; notranslate">

# pre-smoothing improves Hough detector
cvSmooth(thresholded, thresholded, CV_GAUSSIAN, 9, 9)
circles = cvHoughCircles(thresholded, storage, CV_HOUGH_GRADIENT, 2, thresholded.height/4, 100, 40, 20, 200)
</pre><h2>התוצאה</h2><p>התוצאה של הקוד הקצר הזה היתה בעיני מרשימה ביותר &#8211; הרובוט זיהה במהירות  ובדיוק את הכדור, ללא תלות במרחק הכדור מהמצלמה, מהירות התנועה, או חדות  התנועה. את התוצאה אפשר לראות בסרטון הבא:</p><p style="text-align: center;"><p><a href="http://www.youtube.com/watch?v=CigGvt3DXIw">www.youtube.com/watch?v=CigGvt3DXIw</a></p></p><h3 style="text-align: right;">הקוד במלואו, כולל הזזת מצלמת הראש ע&quot;י הפעלת מנועי הסרוו</h3><pre class="brush: python; title: ; notranslate">
/*****************************************************************************************
*  Name    : Fast object tracking using the OpenCV library                               *
*  Author  : Lior Chen &lt;chen.lior@gmail.com&gt;                                             *
*  Notice  : Copyright (c) Jun 2010, Lior Chen, All Rights Reserved                      *
*          :                                                                             *
*  Site    : http://www.lirtex.com                                                       *
*  WebPage : http://www.lirtex.com/robotics/fast-object-tracking-robot-computer-vision   *
*          :                                                                             *
*  Version : 1.0                                                                         *
*  Notes   : By default this code will open the first connected camera.                  *
*          : In order to change to another camera, change                                *
*          : CvCapture* capture = cvCaptureFromCAM( 0 ); to 1,2,3, etc.                  *
*          : Also, the code is currently configured to tracking RED objects.             *
*          : This can be changed by changing the hsv_min and hsv_max vectors             *
*          :                                                                             *
*  License : This program is free software: you can redistribute it and/or modify        *
*          : it under the terms of the GNU General Public License as published by        *
*          : the Free Software Foundation, either version 3 of the License, or           *
*          : (at your option) any later version.                                         *
*          :                                                                             *
*          : This program is distributed in the hope that it will be useful,             *
*          : but WITHOUT ANY WARRANTY; without even the implied warranty of              *
*          : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               *
*          : GNU General Public License for more details.                                *
*          :                                                                             *
*          : You should have received a copy of the GNU General Public License           *
*          : along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;        *
******************************************************************************************/
#!/usr/bin/python
# -*- coding: utf-8 -*-

from opencv.cv import *
from opencv.highgui import *
from threading import Thread
#import serial

class RobotVision:
	cvSize size
	cvImage hsv_frame, thresholded, thresholded2
	cvScalar hsv_min, hsv_max, hsv_min2, hsv_max2
	cvCapture capture;

	def InitBallTracking():
		globals size,  hsv_frame, thresholded, thresholded2, hsv_min, hsv_max, hsv_min2, hsv_max2, capture
		print &quot;Initializing ball Tracking&quot;
		size = cvSize(640, 480)
		hsv_frame = cvCreateImage(size, IPL_DEPTH_8U, 3)
		thresholded = cvCreateImage(size, IPL_DEPTH_8U, 1)
		thresholded2 = cvCreateImage(size, IPL_DEPTH_8U, 1)

		hsv_min = cvScalar(0, 50, 170, 0)
		hsv_max = cvScalar(10, 180, 256, 0)
		hsv_min2 = cvScalar(170, 50, 170, 0)
		hsv_max2 = cvScalar(256, 180, 256, 0)

		storage = cvCreateMemStorage(0)

		# start capturing form webcam
		capture = cvCreateCameraCapture(-1)

		if not capture:
			print &quot;Could not open webcam&quot;
			sys.exit(1)

		#CV windows
		cvNamedWindow( &quot;Camera&quot;, CV_WINDOW_AUTOSIZE );

	def TrackBall(i):
		t = Thread(target=TrackBallThread, args=(i,))
		t.start()

	def TrackBallThread(num_of_balls):
		globals size,  hsv_frame, thresholded, thresholded2, hsv_min, hsv_max, hsv_min2, hsv_max2, capture
		while 1:
			# get a frame from the webcam
			frame = cvQueryFrame(capture)

			if frame is not None:

				# convert to HSV for color matching
				# as hue wraps around, we need to match it in 2 parts and OR together
				cvCvtColor(frame, hsv_frame, CV_BGR2HSV)
				cvInRangeS(hsv_frame, hsv_min, hsv_max, thresholded)
				cvInRangeS(hsv_frame, hsv_min2, hsv_max2, thresholded2)
				cvOr(thresholded, thresholded2, thresholded)

				# pre-smoothing improves Hough detector
				cvSmooth(thresholded, thresholded, CV_GAUSSIAN, 9, 9)
				circles = cvHoughCircles(thresholded, storage, CV_HOUGH_GRADIENT, 2, thresholded.height/4, 100, 40, 20, 200)

				# find largest circle
				maxRadius = 0
				x = 0
				y = 0
				found = False
				for i in range(circles.total):
					circle = circles[i]
					if circle[2] &gt; maxRadius:
						found = True
						maxRadius = circle[2]
						x = circle[0]
						y = circle[1]

				cvShowImage( &quot;Camera&quot;, frame );

				if found:
					print &quot;ball detected at position:&quot;,x, &quot;,&quot;, y, &quot; with radius:&quot;, maxRadius

					if x &gt; 420:
						# need to pan right
						servoPos += 5
						servoPos = min(140, servoPos)
						servo(2, servoPos)
					elif x &lt; 220:
						servoPos -= 5
						servoPos = max(40, servoPos)
						servo(2, servoPos)
					print &quot;servo position:&quot;, servoPos
				else:
					print &quot;no ball&quot;
</pre><h2 style="text-align: right;">קוד מקור בשפת C++</h2><p>להלן קוד המקור בשפת C++. התוכנית מקבלת כקלט תזרים וידאו כלשהו (כאן ספציפית המימוש הוא ממצלמת וידאו), ומציגה אותו. לאחר מכן הוידאו מומר למרחב צבע HSV והתוצאה מוצגת. לאחר מכן מפולטר הצבע הכתום, ושוב התוצאה מוצגת בחלון נפרד. בשלב הסופי האוביקט מזוהה, ומסומן על גבי תזרים הוידאו המקורי.</p><pre class="brush: cpp; title: ; notranslate">
/*****************************************************************************************
*  Name    : Fast object tracking using the OpenCV library                               *
*  Author  : Lior Chen &lt;chen.lior@gmail.com&gt;                                             *
*  Notice  : Copyright (c) Jun 2010, Lior Chen, All Rights Reserved                      *
*          :                                                                             *
*  Site    : http://www.lirtex.com                                                       *
*  WebPage : http://www.lirtex.com/robotics/fast-object-tracking-robot-computer-vision   *
*          :                                                                             *
*  Version : 1.0                                                                         *
*  Notes   : By default this code will open the first connected camera.                  *
*          : In order to change to another camera, change                                *
*          : CvCapture* capture = cvCaptureFromCAM( 0 ); to 1,2,3, etc.                  *
*          : Also, the code is currently configured to tracking RED objects.             *
*          : This can be changed by changing the hsv_min and hsv_max vectors             *
*          :                                                                             *
*  License : This program is free software: you can redistribute it and/or modify        *
*          : it under the terms of the GNU General Public License as published by        *
*          : the Free Software Foundation, either version 3 of the License, or           *
*          : (at your option) any later version.                                         *
*          :                                                                             *
*          : This program is distributed in the hope that it will be useful,             *
*          : but WITHOUT ANY WARRANTY; without even the implied warranty of              *
*          : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               *
*          : GNU General Public License for more details.                                *
*          :                                                                             *
*          : You should have received a copy of the GNU General Public License           *
*          : along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;        *
******************************************************************************************/

#include &lt;opencv/cvaux.h&gt;
#include &lt;opencv/highgui.h&gt;
#include &lt;opencv/cxcore.h&gt;
#include &lt;stdio.h&gt;

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;assert.h&gt;
#include &lt;math.h&gt;
#include &lt;float.h&gt;
#include &lt;limits.h&gt;
#include &lt;time.h&gt;
#include &lt;ctype.h&gt;

int main(int argc, char* argv[])
{

    // Default capture size - 640x480
    CvSize size = cvSize(640,480);

    // Open capture device. 0 is /dev/video0, 1 is /dev/video1, etc.
    CvCapture* capture = cvCaptureFromCAM( 0 );
    if( !capture )
    {
            fprintf( stderr, &quot;ERROR: capture is NULL \n&quot; );
            getchar();
            return -1;
    }

    // Create a window in which the captured images will be presented
    cvNamedWindow( &quot;Camera&quot;, CV_WINDOW_AUTOSIZE );
    cvNamedWindow( &quot;HSV&quot;, CV_WINDOW_AUTOSIZE );
    cvNamedWindow( &quot;EdgeDetection&quot;, CV_WINDOW_AUTOSIZE );

    // Detect a red ball
    CvScalar hsv_min = cvScalar(150, 84, 130, 0);
    CvScalar hsv_max = cvScalar(358, 256, 255, 0);

    IplImage *  hsv_frame    = cvCreateImage(size, IPL_DEPTH_8U, 3);
    IplImage*  thresholded   = cvCreateImage(size, IPL_DEPTH_8U, 1);

    while( 1 )
    {
        // Get one frame
        IplImage* frame = cvQueryFrame( capture );
        if( !frame )
        {
                fprintf( stderr, &quot;ERROR: frame is null...\n&quot; );
                getchar();
                break;
        }

        // Covert color space to HSV as it is much easier to filter colors in the HSV color-space.
        cvCvtColor(frame, hsv_frame, CV_BGR2HSV);
        // Filter out colors which are out of range.
        cvInRangeS(hsv_frame, hsv_min, hsv_max, thresholded);

        // Memory for hough circles
        CvMemStorage* storage = cvCreateMemStorage(0);
        // hough detector works better with some smoothing of the image
        cvSmooth( thresholded, thresholded, CV_GAUSSIAN, 9, 9 );
        CvSeq* circles = cvHoughCircles(thresholded, storage, CV_HOUGH_GRADIENT, 2,
                                        thresholded-&gt;height/4, 100, 50, 10, 400);

        for (int i = 0; i &lt; circles-&gt;total; i++)
        {
            float* p = (float*)cvGetSeqElem( circles, i );
            printf(&quot;Ball! x=%f y=%f r=%f\n\r&quot;,p[0],p[1],p[2] );
            cvCircle( frame, cvPoint(cvRound(p[0]),cvRound(p[1])),
                                    3, CV_RGB(0,255,0), -1, 8, 0 );
            cvCircle( frame, cvPoint(cvRound(p[0]),cvRound(p[1])),
                                    cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
        }

        cvShowImage( &quot;Camera&quot;, frame ); // Original stream with detected ball overlay
        cvShowImage( &quot;HSV&quot;, hsv_frame); // Original stream in the HSV color space
        cvShowImage( &quot;After Color Filtering&quot;, thresholded ); // The stream after color filtering

        cvReleaseMemStorage(&amp;storage);

        // Do not release the frame!

        //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
        //remove higher bits using AND operator
        if( (cvWaitKey(10) &amp; 255) == 27 ) break;
    }

     // Release the capture device housekeeping
     cvReleaseCapture( &amp;capture );
     cvDestroyWindow( &quot;mywindow&quot; );
     return 0;
   }
</pre></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a8%d7%90%d7%99%d7%99%d7%94-%d7%9e%d7%9e%d7%95%d7%97%d7%a9%d7%91%d7%aa-%d7%9e%d7%a2%d7%a7%d7%91-%d7%90%d7%97%d7%a8-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>&#8235;פלטפורמה רובוטית &#8211; רובוט חכם&#8236;</title><link>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a4%d7%9c%d7%98%d7%a4%d7%95%d7%a8%d7%9e%d7%94-%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%aa-%d7%a8%d7%95%d7%91%d7%95%d7%98-%d7%97%d7%9b%d7%9d/</link> <comments>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a4%d7%9c%d7%98%d7%a4%d7%95%d7%a8%d7%9e%d7%94-%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%aa-%d7%a8%d7%95%d7%91%d7%95%d7%98-%d7%97%d7%9b%d7%9d/#comments</comments> <pubDate>Thu, 15 Jul 2010 13:10:56 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[רובוטיקה]]></category> <category><![CDATA[Beagleboard]]></category> <category><![CDATA[I2C]]></category> <category><![CDATA[RS232]]></category> <category><![CDATA[USB]]></category> <category><![CDATA[בקרת הינע]]></category> <category><![CDATA[חיישנים]]></category> <category><![CDATA[מנוע DC]]></category> <category><![CDATA[מנוע סרוו]]></category> <category><![CDATA[עיבוד תמונה]]></category> <category><![CDATA[ראייה ממוחשבת]]></category> <category><![CDATA[רובוט]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=4</guid> <description><![CDATA[&#8235;לאחרונה מצאתי קצת זמן לבנות פלטפורמה רובוטית שתשמש אותי לבחינה של אלגוריתמים שונים ברובוטיקה. הפלטפורמה היא בעצם רובוט 4 גלגלי מבוסס קוד פתוח, ופועל בסביבת Embedded Linux. לפלטפורמה (או אם תרצו לרובוט) יש כרגע את היכולות הבאות: ראייה ממוחשבת (חיקוי של ראייה אנושית, היכולת להבין מה הרובוט רואה ולהתנהג בהתאם). לדוגמה, הרובוט מסוגל לעקוב אחרי [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p dir="rtl"><img style="border-style: groove; border-width: 3px; margin-right: 10px; float: left;" src="http://farm5.static.flickr.com/4098/4763744833_eef4fea53a_z.jpg" alt="Linux Robot" width="347" height="232" />לאחרונה מצאתי קצת זמן לבנות פלטפורמה רובוטית שתשמש אותי לבחינה של אלגוריתמים שונים ברובוטיקה. הפלטפורמה היא בעצם רובוט 4 גלגלי <strong>מבוסס קוד פתוח</strong>, ופועל בסביבת <strong>Embedded Linux</strong>.</p><p dir="rtl">לפלטפורמה (או אם תרצו לרובוט) יש כרגע את היכולות הבאות:</p><ol><li dir="rtl"><strong>ראייה ממוחשבת</strong> (חיקוי של ראייה אנושית, היכולת להבין מה הרובוט רואה ולהתנהג בהתאם). לדוגמה, הרובוט מסוגל לעקוב אחרי אובייקטים שונים, לזהות פנים, ולהתנייד בצורה עצמאית בחדר שמכיל מכשולים.</li><li dir="rtl"><strong>סינטזת דיבור </strong>(Speech Synthesis) &#8211; היכולת לדבר בקול שנשמע אנושי. האמת היא שכאן דווקא בחרתי בקול שנשמע רובוטי, אבל העיקרון עדיין זהה &#8211; הרובוט מסוגל לדבר, להרכיז על פעולות שונות שהוא מבצע, דברים שהוא מגלה, ובמקרים מסויימים להשיב על שאלות (עוד על כך &#8211; בהמשך)</li><li dir="rtl"><strong>זיהוי דיבור</strong> &#8211; היכולת להבין ולהגיב לפקודות אנושיות. לדוגמה: &quot;Move Forward!&quot;, &quot;Stop!&quot; וכו'.</li></ol><p><span id="more-4"></span></p><p style="text-align: center;"><p style="text-align: right;" dir="rtl"><p><a href="http://www.youtube.com/watch?v=okt-2_VxGfc&#038;fmt=18">www.youtube.com/watch?v=okt-2_VxGfc</a></p></p><h2 style="text-align: right;" dir="rtl">ראייה ממוחשבת (Computer Vision)</h2><p style="text-align: right;" dir="rtl">למימוש רוב יכולות הראיה המומחשבת, השתמשתי בספריית הקוד הפתוח <a href="http://opencv.willowgarage.com/wiki/">OpenCV</a>. הספרייה פועלת בסביבת לינוקס ומתמקדת בעיקר ביכולות עיבוד תמונה מתקדמות ב<a href="%D7%9E%D7%90%D7%9E%D7%A8%D7%99%D7%9D/%D7%9E%D7%91%D7%95%D7%90-%D7%9C%D7%A4%D7%99%D7%AA%D7%95%D7%97-%D7%9E%D7%A2%D7%A8%D7%9B%D7%95%D7%AA-%D7%96%D7%9E%D7%9F-%D7%90%D7%9E%D7%AA-%D7%91%D7%A1%D7%91%D7%99%D7%91%D7%AA-%D7%9C%D7%99%D7%A0%D7%95%D7%A7%D7%A1-real-time-linux">זמן אמת (real time)</a>.</p><p style="text-align: right;" dir="rtl">אלגורתמי הראיה הממוחשבת שמומשתי בינתיים:</p><ol><li dir="rtl"><strong>מעקב אחרי קו</strong> המסומן על הקרקע (Line Following).</li><li dir="rtl"><strong>מעקב אחרי אובייקט (Object Tracking)</strong>, לדוגמה כדור אדום. מדובר בשני סוגי מעקב &#8211; הראשון, יכולת של הרובוט להזיז את המערכת הראייה שלו ולעקוב אחרי מיקום הכדור (ללא תנועה אליו), והשני היכולת של הרובוט להבין היכן נמצא הכדור ולנוע אליו.</li><li dir="rtl"><strong>זיהוי פנים</strong> &#8211; יכולת ניסויית שכרגע עדיין נמצאת בפיתוח. הרעיון הוא ראשית לזהות קיום של פני אדם במרחב הראייה של הרובוט, ולאחר מכן זיהוי אנושי של הפנים (ובמילים פשוטות &#8211; מי האדם). זיהוי האדם מבוצע באמצעות <a href="http://face.com/">Face API</a>.</li></ol><p>לקריאה נוספת, אלגוריתמים, תמונות, סרטונים ודוגמאות קוד &#8211; <a href="http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a8%d7%90%d7%99%d7%99%d7%94-%d7%9e%d7%9e%d7%95%d7%97%d7%a9%d7%91%d7%aa-%d7%9e%d7%a2%d7%a7%d7%91-%d7%90%d7%97%d7%a8-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/">ראייה ממוחשבת &#8211; מעקב מהיר אחר אובייקט</a>.</p><p style="text-align: justify;"><h2 style="text-align: right;" dir="rtl">סינטזת דיבור (Speech Synthesis)</h2><p dir="rtl">לסינטזת דיבור הרובוט משתמש בספרייה פתוחה נוספת שנקראת eSpeak. בחרתי בה במכוון בגלל הקול הרובוטי שמוסיף לאווירה <img src='http://www.lirtex.com/he/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p><p dir="rtl">הרובוט משתמש בדיבור כדי להכריז על פעולות שהוא מבצע, כגון: &quot;Moving Forward&quot;, &quot;Turning Left&quot; וכו', כדי לומר שלום לאנשים אותם הוא מזהה (&quot;Hi, Lior&quot;), או מסקנות בסיסיות אליהן הוא מגיע (&quot;Obsticle detected in front. Turning left&quot;).</p><p dir="rtl"><h2 style="text-align: right;" dir="rtl">זיהוי דיבור (Speech Recognition)</h2><p dir="rtl">כדי שהרובוט יוכל להגיב לפקודות קוליות, הוספתי לו יכולות של זיהוי דיבור באמצעות שימוש ב-<a href="http://cmusphinx.sourceforge.net/">CMU Sphinx</a> (למעשה Pocket Sphinx שרץ על ארכיטקטורת ARM).</p><p dir="rtl">הרובוט מבין פקודות בסיסיות כגון &quot;Move Forward&quot;, &quot;Stop&quot; ופקודות איתחול אלגוריתמים שונים, לדוגמה: &quot;Follow Ball&quot; שלאחריה הרובוט יתחיל מעקב אחרי כדור, כמו שתואר בחלק הקודם.</p><p style="text-align: justify;"><p style="text-align: center;"><h2 style="text-align: justify;" dir="rtl">תרשים על של הרובוט (TLD)</h2><p style="text-align: center;"><a href="http://www.lirtex.com/hex/wp-content/uploads/2010/07/Intellibot-TLD-1024x7681.jpg" rel="lightbox[4]" title="Intellibot-TLD-1024x768"><img class="size-full wp-image-28 aligncenter" style="border: 0pt none;" title="Intellibot-TLD-1024x768" src="http://www.lirtex.com/hex/wp-content/uploads/2010/07/Intellibot-TLD-1024x7681.jpg" alt="" width="720" height="541" /></a></p><p style="text-align: center;"><p style="text-align: center;"><img src="http://farm5.static.flickr.com/4098/4763744833_eef4fea53a_z.jpg" alt="Linux Robot" width="640" height="426" /></p><p style="text-align: center;"><p style="text-align: center;"><p style="text-align: center;"><img src="http://farm5.static.flickr.com/4116/4763744099_a1c148f41b_z.jpg" alt="Intellibot - an intelligent embedded linux robot" width="640" height="426" /></p><p style="text-align: center;"><p style="text-align: center;"><p style="text-align: center;"><img src="http://farm5.static.flickr.com/4123/4763743685_f7334bd412_z.jpg" alt="Linux Robot" width="640" height="426" /></p><p style="text-align: center;"><p style="text-align: center;"><p style="text-align: center;"><img src="http://farm5.static.flickr.com/4136/4764380366_fc579055f1_z.jpg" alt="Linux Robotic Platform" width="640" height="426" /></p><p style="text-align: center;"><p style="text-align: center;"><p style="text-align: center;"><img src="http://farm5.static.flickr.com/4139/4763742381_9b20c629f3_z.jpg" alt="Linux Robotic Platform" width="640" height="426" /></p><p style="text-align: center;"><p style="text-align: center;"><h2 style="text-align: right;" dir="rtl">מפרט טכני</h2><ul><li dir="rtl">מימדים:</li><li dir="rtl">משקל:</li><li dir="rtl">הספק:</li><li dir="rtl">מתח:</li><li dir="rtl">מנועים:</li><li dir="rtl">חישנים:</li><li dir="rtl">קישוריות:</li></ul><div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">http://www.youtube.com/watch?v=okt-2_VxGfc</div></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%a4%d7%9c%d7%98%d7%a4%d7%95%d7%a8%d7%9e%d7%94-%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%aa-%d7%a8%d7%95%d7%91%d7%95%d7%98-%d7%97%d7%9b%d7%9d/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>&#8235;מבוא לפיתוח מערכות זמן-אמת בסביבת לינוקס (Real-Time Linux)&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%9e%d7%91%d7%95%d7%90-%d7%9c%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9e%d7%a2%d7%a8%d7%9b%d7%95%d7%aa-%d7%96%d7%9e%d7%9f-%d7%90%d7%9e%d7%aa-%d7%91%d7%a1%d7%91%d7%99%d7%91%d7%aa-%d7%9c%d7%99%d7%a0%d7%95/</link> <comments>http://www.lirtex.com/he/embedded/%d7%9e%d7%91%d7%95%d7%90-%d7%9c%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9e%d7%a2%d7%a8%d7%9b%d7%95%d7%aa-%d7%96%d7%9e%d7%9f-%d7%90%d7%9e%d7%aa-%d7%91%d7%a1%d7%91%d7%99%d7%91%d7%aa-%d7%9c%d7%99%d7%a0%d7%95/#comments</comments> <pubDate>Mon, 18 May 2009 22:40:02 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[Embedded]]></category> <category><![CDATA[Embedded Linux]]></category> <category><![CDATA[Real Time]]></category> <category><![CDATA[זמן אמת]]></category> <category><![CDATA[לינוקס]]></category> <category><![CDATA[משובץ לינוקס]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=15</guid> <description><![CDATA[&#8235;מאמר זה סוקר פיתוח אפליקציות זמן אמת תחת לינוקס. המאמר מתחיל מסקירת הצורך, הגדרת סוגים שונים של מערכות זמן-אמת, מאפייני מערכות זמן-אמת, ופיתוח אפליקציות זמן-אמת תחת לינוקס.&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p dir="rtl"></p><p><img style="border: 0pt none;" title="Real Time Linux" src="/images/articles/Linux/RealTimeLinux/ClockPenguin.jpg" border="0" alt="Real Time Linux" width="188" height="225" align="left" /><span style="font-family: DejaVu Sans;">מאמר זה סוקר פיתוח אפליקציות זמן אמת תחת לינוקס</span>. <span style="font-family: DejaVu Sans;">המאמר מתחיל מסקירת הצורך</span>, <span style="font-family: DejaVu Sans;">הגדרת סוגים שונים של מערכות זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span>, <span style="font-family: DejaVu Sans;">מאפייני מערכות זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span>, <span style="font-family: DejaVu Sans;">ופיתוח אפליקציות זמן</span>-<span style="font-family: DejaVu Sans;">אמת תחת לינוקס</span>.</p><p><span id="more-15"></span></p><h2><span style="font-family: DejaVu Sans;">מהי מערכת </span>'<span style="font-family: DejaVu Sans;">זמן אמת</span>'?</h2><p dir="rtl"><span style="font-family: DejaVu Sans;">מערכת <strong>חומרה</strong> או <strong>תכנה</strong> תקרא מערכת <strong>זמן</strong></span><strong>-</strong><span style="font-family: DejaVu Sans;"><strong>אמת</strong></span>, <span style="font-family: DejaVu Sans;">אם הנה נדרשת לעמוד בקבועי זמן מדויקים וקבועים מראש</span>. <span style="font-family: DejaVu Sans;">מערכת אינה מערכת זמן</span>-<span style="font-family: DejaVu Sans;">אמת אם כל שנדרש ממנה הוא “לעבוד כמה שיותר מהר”</span>. <span style="font-family: DejaVu Sans;">מערכת זמן</span>-<span style="font-family: DejaVu Sans;">אמת נדרשת לעמוד בקבועי הזמן שהוגדרו לה</span>, <span style="font-family: DejaVu Sans;"><strong>ללא תלות בעומס הכללי</strong> במערכת</span>. <span style="font-family: DejaVu Sans;">הגדרה נוספת למערכת זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span>, <span style="font-family: DejaVu Sans;">היא מערכת שפעולה שלה מוגדרת כתקינה לא רק אם היא תקינה מבחינה לוגית</span>, <span style="font-family: DejaVu Sans;">אלא גם תלויה בזמן שלוקח לבצע אותה</span>.</p><p dir="rtl"><span style="font-family: DejaVu Sans;">דוגמה למערכת</span>-<span style="font-family: DejaVu Sans;">זמן אמת היא מערכת להקלטה של שידורי וידאו</span>. <span style="font-family: DejaVu Sans;">על מערכת כזו לקודד </span>30 <span style="font-family: DejaVu Sans;">פריימים בשנייה ובמקביל לקודד שני ערוצי שמע</span>, <span style="font-family: DejaVu Sans;">תוך שמירה על סנכרון בין הווידאו והשמע</span>. <span style="font-family: DejaVu Sans;">אם המערכת לא תעמוד בהגדרות הביצועים האלו</span>, <span style="font-family: DejaVu Sans;">ייעלמו מקטעים מהתצוגה ו</span>\<span style="font-family: DejaVu Sans;">או מהשמע – ואת זאת ניתן להגדיר ככישלון המערכת</span>.</p><p dir="rtl"><span style="font-family: DejaVu Sans;">דוגמה למערכת שאינה מערכת זמן אמת</span>, <span style="font-family: DejaVu Sans;">למרות שפעולה מהירה שלה נחשבת רצויה</span>, <span style="font-family: DejaVu Sans;">היא מערכת </span>Outlook <span style="font-family: DejaVu Sans;">לקריאת דוא</span>&quot;<span style="font-family: DejaVu Sans;">ל</span>. <span style="font-family: DejaVu Sans;">גם אם מערכת זו לא תגיב במהירות</span>, <span style="font-family: DejaVu Sans;">וייקח זמן מסוים כדי לעבור מקריאת הודעה אחת לשנייה</span>, <span style="font-family: DejaVu Sans;">אין בכך משום כישלון בפעולת המערכת</span>.</p><h1 class="western" dir="rtl"><span style="font-family: DejaVu Sans;">סוגים שונים של מערכות זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span></h1><p dir="rtl"><span style="font-family: DejaVu Sans;">בספרות המקצועית מוגדרים שני סוגים של מערכות זמן אמת</span>: <span style="font-family: DejaVu Sans;">מערכות </span><strong>Hard Real-Time</strong> <span style="font-family: DejaVu Sans;">ומערכות </span><strong>Soft Real-Time</strong>.</p><h3 class="western" dir="rtl"><span style="font-family: DejaVu Sans;"><strong>מערכת </strong></span><strong>Hard Real Time</strong></h3><p dir="rtl"><span style="font-family: DejaVu Sans;">מערכת תוגדר כמערכת </span>Hard Real Time <span style="font-family: DejaVu Sans;">אם במערכת קיימות פעולות שסיום ביצוען ללא עמידה בקבועי הזמנים שהוגדרו מראש היא חסרת כל תועלת</span>.</p><p dir="rtl"><span style="font-family: DejaVu Sans;">דוגמאות למערכות </span>Hard Real-Time:</p><ol><li><p dir="rtl"><span style="font-family: DejaVu Sans;">מערכת 	בקרה של טיל ליירוט טילים כדוגמת החץ</span>. <span style="font-family: DejaVu Sans;">מיותר להסביר מדוע אין 	משמעות לתגובה מאוחרת של מערכת כזו לתנועת 	הטיל אותו היא אמורה להשמיד</span>.</p></li><li><p dir="rtl"><span style="font-family: DejaVu Sans;">מערכת 	בקרה של מנוע רכב</span>, <span style="font-family: DejaVu Sans;">היות 	ועיכוב בשליחת סיגנל בקרה למנוע עלול 	להכשיל את פעולת המנוע או אפילו לפגוע 	בו</span>.</p></li><li><p dir="rtl"><span style="font-family: DejaVu Sans;">מערכות 	בקרה תעשייתיות</span>, <span style="font-family: DejaVu Sans;">או 	מערכות בקרה לרובוטיקה</span>, <span style="font-family: DejaVu Sans;">בהן 	נדרש סנכרון מדויק בין מספר רכיבי מערכת</span>.</p></li></ol><h3 class="western" dir="rtl"><span style="font-family: DejaVu Sans;">מערכות </span>Soft Real-Time</h3><p dir="rtl"><span style="font-family: DejaVu Sans;">מערכת תוגדר כ </span><strong>Soft Real Time</strong> <span style="font-family: DejaVu Sans;">אם יש למערכת דרישות ביצועים מדויקות</span>, <span style="font-family: DejaVu Sans;">אך אי עמידה בהם לא נחשבת לכישלון המערכת</span>. <span style="font-family: DejaVu Sans;">לעיתים המערכת תוכל לספק מענה מופחת לדרישות אך לעמוד בקבועי הזמן</span>. <span style="font-family: DejaVu Sans;">דוגמה לכך היא ניגון סרטון וידאו במחשב והצגה של חלק מהפריימים בלבד</span>.</p><h2 class="western" dir="rtl"><span style="font-family: DejaVu Sans;">מדוע נדרש פיתוח </span>Real-Time? <span style="font-family: DejaVu Sans;">הצורך בגרסת </span>Real-Time Linux.</h2><p dir="rtl"><span style="font-family: DejaVu Sans;">כאמור</span>, <span style="font-family: DejaVu Sans;">לפעולות במערכת </span>Real Time <span style="font-family: DejaVu Sans;">יש דרישות ביצועים במגבלות זמן מסוימות</span>. <span style="font-family: DejaVu Sans;">נניח שאנו נדרשים לפתח אפליקציה שתגיב לפעולה מסוימת של המשתמש במגבלת זמן של עד שנייה אחת</span>. <span style="font-family: DejaVu Sans;">נניח שפיתחנו את האפליקציה ושהיא רצה תחת גרסה רגילה של לינוקס </span>(<span style="font-family: DejaVu Sans;">שאינה מ</span>&quot;<span style="font-family: DejaVu Sans;">ה זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span>). <span style="font-family: DejaVu Sans;">בנוסף</span>, <span style="font-family: DejaVu Sans;">בבדיקות הביצועים של האפליקציה נמדד זמן תגובה ממוצע של חצי</span>-<span style="font-family: DejaVu Sans;">שנייה – מהיר ב</span>-50% <span style="font-family: DejaVu Sans;">מהנדרש</span>. <span style="font-family: DejaVu Sans;">האם הדרישות נענו</span>? <span style="font-family: DejaVu Sans;">לצערנו</span>, <span style="font-family: DejaVu Sans;">לא</span>.</p><p dir="rtl"><span style="font-family: DejaVu Sans;">הסיבה לכך היא גרסת מערכת ההפעלה</span>, <span style="font-family: DejaVu Sans;">שאינה </span>Real Time. <span style="font-family: DejaVu Sans;">מתזמן התהליכים של לינוקס </span>(Linux Scheduler) <span style="font-family: DejaVu Sans;">מתוכנן לזמן תגובה אופטימלי במקרה הממוצע</span>. <span style="font-family: DejaVu Sans;">הוא מתוכנן בצורה כזו כדי ליצור תחושה של מערכת ריספונסיבית ומהירה</span>, <span style="font-family: DejaVu Sans;">אפילו כשמספר רב של אפליקציות רצות במקביל</span>. <span style="font-family: DejaVu Sans;">אולם הוא אינו מבטיח שהרצת תהליך מסוים תסתיים בזמן מוגדר</span>. <span style="font-family: DejaVu Sans;">הרצת התהליך עלולה להיות מופסקת בכל רגע לטובת הרצת תהליכים אחרים </span>(Context-Switching), <span style="font-family: DejaVu Sans;">או קריאות מערכת אחרות</span>. <span style="font-family: DejaVu Sans;">מנגד</span>, <span style="font-family: DejaVu Sans;">מערכת הפעלה שהינה </span>Real-Time <span style="font-family: DejaVu Sans;">מציעה תזמון תהליכים עם חלוקת זמן מובטחת </span>(Real Time Scheduler).</p><h2 class="western" dir="rtl"><span style="font-family: DejaVu Sans;">אלטרנטיבות לשימוש ב</span>-Real Time Linux</h2><p dir="rtl"><span style="font-family: DejaVu Sans;">רגע לפני שאנחנו קופצים למים העמוקים של </span>RT Linux, <span style="font-family: DejaVu Sans;">חשוב לציין מספר אלטרנטיבות שכדאי לבחון</span>. <span style="font-family: DejaVu Sans;">לפעמים אפשר לעקוף את הצורך בשימוש במערכת הפעלה זמן</span>-<span style="font-family: DejaVu Sans;">אמת על ידי שימוש ברכיבי חומרה ייעודיים לביצוע חלק מפעולות המערכת</span>. <span style="font-family: DejaVu Sans;">לדוגמה</span>, <span style="font-family: DejaVu Sans;">במקום לפתח מערכת בקרה להנעת זרוע רובוטית באמצעות </span>RT Linux, <span style="font-family: DejaVu Sans;">ניתן להשתמש במספר מעגלי בקרה חיצוניים שיקבלו פקודות ממערכת הבקרה הראשית </span>(<span style="font-family: DejaVu Sans;">שלא תהייה מונחת זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span>). <span style="font-family: DejaVu Sans;">בצורה כזו חלק ניכר מעומס המערכת ודרישות הזמן הקפדניות מועברות לרכיבים חיצוניים</span>, <span style="font-family: DejaVu Sans;">ובכך מונעים את הצורך בשימוש במערכת הפעלה זמן</span>-<span style="font-family: DejaVu Sans;">אמת</span>. <span style="font-family: DejaVu Sans;">כמובן שה</span>-tradeoff <span style="font-family: DejaVu Sans;">הוא הוספת חומרה ייעודית והעלאת הסיבוכיות של ארכיטקטורת המערכת הכללית</span>.</p><p style="margin-top: 0.17in; page-break-after: avoid;" dir="rtl"><span style="font-family: DejaVu Sans;"><span style="font-size: medium;">מאמרי המשך</span></span></p><p dir="rtl"><span style="font-family: DejaVu Sans;">גרסאות שונות של </span>Real Time Linux</p><p dir="rtl">RTAI Linux</p><p dir="rtl"><span style="font-family: DejaVu Sans;">התקנת </span>RTAI Linux <span style="font-family: DejaVu Sans;">על בסיס </span>Debian</p><p dir="rtl"><span style="font-family: DejaVu Sans;">הדגמת פיתוח זמן אמת – פיתוח בקר למנועי סרוו</span>.</p></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%9e%d7%91%d7%95%d7%90-%d7%9c%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9e%d7%a2%d7%a8%d7%9b%d7%95%d7%aa-%d7%96%d7%9e%d7%9f-%d7%90%d7%9e%d7%aa-%d7%91%d7%a1%d7%91%d7%99%d7%91%d7%aa-%d7%9c%d7%99%d7%a0%d7%95/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>&#8235;בחירת לוח פיתוח משובץ לינוקס (Embedded Linux)&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%91%d7%97%d7%99%d7%a8%d7%aa-%d7%9c%d7%95%d7%97-%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9e%d7%a9%d7%95%d7%91%d7%a5-%d7%9c%d7%99%d7%a0%d7%95%d7%a7%d7%a1-embedded-linux/</link> <comments>http://www.lirtex.com/he/embedded/%d7%91%d7%97%d7%99%d7%a8%d7%aa-%d7%9c%d7%95%d7%97-%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9e%d7%a9%d7%95%d7%91%d7%a5-%d7%9c%d7%99%d7%a0%d7%95%d7%a7%d7%a1-embedded-linux/#comments</comments> <pubDate>Sun, 22 Feb 2009 19:57:47 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[Embedded]]></category> <category><![CDATA[Beagleboard]]></category> <category><![CDATA[Embedded Linux]]></category> <category><![CDATA[I2C]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[RS232]]></category> <category><![CDATA[USB]]></category> <category><![CDATA[לינוקס]]></category> <category><![CDATA[משובץ לינוקס]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=9</guid> <description><![CDATA[&#8235;מאמר זה עוסק בבחירת לוח פיתוח משובץ לינוקס (Embedded Linux). המאמר סוקר שיקולים בבחירת לוח הפיתוח, מחירים, דרישות הספק, יכולות עיבוד ומימשקים (Interfaces), וסוקר מספר לוחות מומלצים בתחום.&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p dir="rtl"><img class="alignleft" style="border: 0pt none;" title="Embedded Linux" src="http://www.lirtex.com/wp-content/uploads/2009/02/linux_on_hardware-300x179.jpg" alt="" width="300" height="179" />מאמר זה עוסק בבחירת לוח פיתוח משובץ לינוקס (Embedded Linux). המאמר סוקר שיקולים בבחירת לוח הפיתוח, מחירים, דרישות הספק, יכולות עיבוד ומימשקים (Interfaces), וסוקר מספר לוחות מומלצים בתחום.</p><p dir="rtl"><p><span id="more-9"></span></p><p dir="rtl">לאחרונה התחלתי לעבוד על שני פרויקטים חדשים בתחום ה-Embedded:</p><ol dir="rtl"><li>פלטפורמה רובוטית עצמאית המסוגלת לנווט במרחב ע&quot;י שימוש בסנסורים שונים ואלגוריתמים של עיבוד תמונה. הפלטפורמה מתקשרת עם מחשב בקרה (host) באמצעות WIFI.</li><li>מחשב לרכב &#8211; מערכת Embedded שתותקן ברכב, תהייה בעלת GPS ויכולות WIFI, ותתחבר למערכת השמע והווידאו ברכב. למערכת יהיה ניתן להעביר שירים, סרטים ומסלולי ניווט ישירות מהמחשב הביתי (drag and drop) בזמן שהרכב נמצא בחנייה.</li></ol><p dir="rtl">לאחר בחינת הדרישות ומורכבות המימוש החלטתי כי הפלטפורמה האידיאלית למימוש שני הפרויקטים היא לוח משובץ לינוקס (Embedded Linux). הפרויקטים ידרשו קאסטומיזציה של הלוחות ה-Distribution והקרנל (פיתוח דרייברים).</p><p dir="rtl"><p dir="rtl">בחירת לוח משובץ לינוקס הוא לא דבר פשוט היות וישנן ואריאציות רבות במחירים שונים, גדלים שונים, יכולות שונות ודרישות הספק שונות.לפרויקטים אלו קבעתי רף מחיר עליון של 150$, גודל לוח בקירוב 10&#215;10 ס&quot;מ, ודרישות ההספק של-1 אמפר במתח של 5v. לגבי היכולות &#8211; אפשרויות חיבוריות מגוונות הן היתרון הבולט ביותר עבורי (USB, Ethernet, Wifi, Serial), ויתרונות משמעותיים הם מעבד גרפי ומעבד שמע on-board.</p><p dir="rtl"><p dir="rtl">להלן מספר אפשרויות מרכזיות העונות על הדרישות ומומלצות על ידי:</p><h3 style="text-align: right;" dir="rtl"><strong><strong>לוח פיתוח משובץ לינוקס &#8211; BeagleBoard</strong></strong></h3><h3 style="text-align: right;" dir="rtl"><strong><strong><br /> </strong></strong></h3><p><strong><strong> </strong></strong></p><div style="text-align: center;"><strong><strong><img class="alignnone" title="Beagleboard ביגלבורד" src="http://www.lirtex.com/wp-content/uploads/2009/02/beagleboard1.jpg" alt="" width="700" height="592" /><br /> </strong></strong></div><p><strong><strong> </strong></strong></p><p style="text-align: center;" dir="rtl">לוח הביגל (BeagleBoard) &#8211; לוח משובץ לינוקס קומפקטי, עם דרישות הספק נמוכות וללא מאווררים.</p><p dir="rtl"><strong>מחיר:</strong><strong> </strong>150$</p><p dir="rtl"><strong>תכונות (Features):</strong></p><ul dir="rtl"><li>600 MHz ARM Cortex-A8 CPU</li><li>128mb LPDDR RAM, 256mb NAND Flash</li><li>MMC+/SD/SDIO interface for memory or wireless connectivity</li><li>OpenGL  capable 2D/3D graphics accelerator</li><li>Power consumption of 2W</li></ul><p dir="rtl"><strong>חיבוריות וממשקים (Interfaces):</strong></p><ul dir="rtl"><li>USB 2.0 On The Go</li><li>I2C, SPI</li><li>RS-232</li><li>DVI-D, S-Video out</li><li>Stereo audio in and out</li><li>JTAG (debugging)</li></ul><p dir="rtl">מאחורי הביגל-בורד, כמו כמעט כל פרויקט בתחום הלינוקס והקוד הפתוח, עומדת קהיליית משתמשים חזקה המספקת מקור מידע עשיר מבוסס Wiki, פורומים, וערוץ IRC פעיל לאורך כל שעות היממה (גם אני שם, בכינוי lirtex).</p><p dir="rtl"><p dir="rtl"><strong>מידע נוסף:</strong></p><ul><li dir="rtl">דף הבית: <a href="http://beagleboard.org/" target="_blank">http://beagleboard.org</a></li><li dir="rtl">וויקי: <a href="http://elinux.org/BeagleBoard">http://elinux.org/BeagleBoard</a></li></ul><h3 style="text-align: right;" dir="rtl"><strong><br /> </strong></h3><h3 style="text-align: right;" dir="rtl"><strong><strong><strong><strong>לוח פיתוח משובץ לינוקס &#8211; </strong></strong>Linux Stamp</strong></strong></h3><p><strong><strong><br /> </strong></strong></p><div class="wp-caption aligncenter" style="width: 510px;"><strong><strong> </strong></strong></div><p style="text-align: center;"><img class="aligncenter" title="לוח פיתוח משובץ לינוקס - Linux Stamp Embedded Board" src="http://www.lirtex.com/wp-content/uploads/2009/02/linux-stamp.jpg" alt="לוח פיתוח משובץ לינוקס - Embedded Linux Stamp Board" /></p><p style="text-align: center;" dir="rtl">לוח ה-LinuxStamp הוא לוח מבוסס חומרה פתוחה (open source) המבוסס על מעבד AT91RM9200 של חברת Atmel.</p><p style="text-align: center;" dir="rtl"><p dir="rtl"><strong>מחיר:</strong><strong> </strong>120$.</p><p dir="rtl"><p dir="rtl"><strong>תכונות (Features)</strong></p><ul dir="rtl"><li>Atmel AT91RM9200 processor (Arm9 processor with MMU, 180Mhz operation)</li><li>32MB SDRAM (Only limited by 1x 54-TSOP SDRAM chip)</li><li>8MB SPI Dataflash</li><li>1x SD card slot</li><li>POE capable (48v -&gt; 5v Power supply can be implemented on a motherboard)</li></ul><p dir="rtl"><strong>חיבוריות וממשקים (Interfaces)</strong><strong>:</strong></p><ul dir="rtl"><li><span style="font-size: 18px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px ! important;">1x 10/100 Ethernet</span></span></span></span></span></span></span></span></span></span></span></span></span></li><li><span style="font-size: 18px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px ! important;">1x USB host port (allows wifi adapters, flash drives and other USB devices to be used)</span></span></span></span></span></span></span></span></span></span></span></span></span></li><li><span style="font-size: 18px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px ! important;">Serial debug port access through FTDI USB/Serial converter</span></span></span></span></span></span></span></span></span></span></span></span></span></li><li><span style="font-size: 18px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px ! important;">JTAG port</span></span></span></span></span></span></span></span></span></span></span></span></span></li></ul><p dir="rtl"><strong>מידע נוסף:</strong></p><ul dir="rtl"><li>דף הבית: <a href="http://www.thelinuxstamp.com/">http://www.thelinuxstamp.com</a></li><li>ווקי: <a href="http://opencircuits.com/Linuxstamp">http://opencircuits.com/Linuxstamp</a></li></ul><h3 style="text-align: right;" dir="rtl"><strong>לוח פיתוח משובץ לינוקס &#8211; Gumstix Overo</strong></h3><p style="text-align: center;"><img class="aligncenter" style="border: 0pt none;" title="gumstix-overo" src="http://www.lirtex.com/wp-content/uploads/2009/02/gumstix-overo.jpg" border="0" alt="Gumstix Oveo Linux Board" /></p><p style="text-align: center;" dir="rtl">לוח משובץ לינוקס -Gumstix Oveo</p><p dir="rtl"><p dir="rtl">לוחות ה-gumstix &#8211; כשמם כן הם &#8211; לוחות משובצי לינוקס שנראים כמו &quot;מקלות מסטיק&quot; (בתרגום חופשי). הם מאופיינים בגודל קטן במיוחד, משקל נמוך ודרישות הספק נמוכות, אך עם זאת עם רשימת יכולות מרשימה.</p><p dir="rtl"><p dir="rtl"><strong>מחיר:</strong><strong> </strong>150$</p><p dir="rtl"><p dir="rtl"><strong>תכונות (Features)</strong><strong><span style="font-size: 18px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px;"><span style="font-size: 12px ! important;">:</span></span></span></span></span></span></span></span></span></span></span></span></span></strong></p><ul dir="rtl"><li><span style="font-size: 10pt; font-family: arial,helvetica,sans-serif;">600-MHz ARM Cortex™-A8 Core </span></li><li><span style="font-size: 10pt;"><span class="Apple-style-span" style="font-family: Arial;">256 MB</span></span><span style="font-size: 10pt;"><span class="Apple-style-span" style="font-family: Arial;"> low power DDR RAM</span></span></li><li><span class="Apple-style-span" style="font-size: 10pt; font-family: Arial;">256 MB NAND Flash</span></li><li><span style="font-size: 10pt;"> </span><span class="Apple-style-span" style="font-size: 10pt; font-family: Arial;">microSD adapter</span></li></ul><p dir="rtl"><strong>חיבוריות וממשקים (Interfaces)</strong><strong>:</strong></p><ul dir="rtl"><li>I2C, PWM lines (6), A/D (6), 1-wire, UART, SPI, Camera in, Extra MMC lines</li><li>audio in, audio out</li><li>USB OTG signals, USB HS Host</li></ul><p dir="rtl">החסרון המרכזי של ה-Gumstix לטעמי הוא העובדה שכל יכולות החיבוריות נחשפות בתור סיגנאלים (signals) ואין על הלוח את המחברים עצמם, מה שדורש לוח הרחבה ייעודי.</p><p dir="rtl"><p><strong> </strong></p><h3 style="text-align: right;"><strong>מסקנות</strong></h3><p><strong><br /> </strong></p><p style="text-align: right;" dir="rtl">אחרי ניתוח היכולות השונות של הלוחות והשוואה בניהם, החלטתי לבחור בלוח ה-BeagleBoard. יש לו יותר features, ולטעמי הוא מנצח ביחס העלות\תועלת.</p></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%91%d7%97%d7%99%d7%a8%d7%aa-%d7%9c%d7%95%d7%97-%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9e%d7%a9%d7%95%d7%91%d7%a5-%d7%9c%d7%99%d7%a0%d7%95%d7%a7%d7%a1-embedded-linux/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>&#8235;פיתוח דרייבר למשדר מקלט אינפרה-אדום &#8211; שליטה במכשירים חשמליים מהמחשב&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%93%d7%a8%d7%99%d7%99%d7%91%d7%a8-%d7%9c%d7%9e%d7%a9%d7%93%d7%a8-%d7%9e%d7%a7%d7%9c%d7%98-%d7%90%d7%99%d7%a0%d7%a4%d7%a8%d7%94-%d7%90%d7%93%d7%95%d7%9d-%d7%a9%d7%9c/</link> <comments>http://www.lirtex.com/he/embedded/%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%93%d7%a8%d7%99%d7%99%d7%91%d7%a8-%d7%9c%d7%9e%d7%a9%d7%93%d7%a8-%d7%9e%d7%a7%d7%9c%d7%98-%d7%90%d7%99%d7%a0%d7%a4%d7%a8%d7%94-%d7%90%d7%93%d7%95%d7%9d-%d7%a9%d7%9c/#comments</comments> <pubDate>Sun, 01 Feb 2009 11:34:03 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[Embedded]]></category> <category><![CDATA[Embedded Linux]]></category> <category><![CDATA[IR]]></category> <category><![CDATA[Kernel Module]]></category> <category><![CDATA[UART]]></category> <category><![CDATA[אינפרה-אדום]]></category> <category><![CDATA[דרייבר]]></category> <category><![CDATA[לינוקס]]></category> <category><![CDATA[משובץ לינוקס]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=73</guid> <description><![CDATA[&#8235;במסגרת פרויקט בית חכם עליו עבדתי, רציתי להתממשק לרכיבי חשמל המופעלים על ידי תשדורת אינפרה-אדום כך שאוכל לשלוט בהם באמצעות תוכנה מהמחשב. ישנם הרבה מכשירים ביתיים כאלו: הטלוויזיה, ממיר הכבלים, מערכת הסטריאו, המזגן וכדומה. מה שמקשה על התממשקות כזו לרכיבים רבים במקביל הם שלל הפרוטוקולים השונים לתקשורת IR. מבדיקה שרירותית שביצעתי ע&#34;י שימוש ב-Scope, לרוב [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><div dir="rtl"><p><a href="http://www.lirtex.com/he/wp-content/uploads/2010/09/IR-Transciever.jpg" rel="lightbox[73]" title="משדר מקלט אינפרה-אדום (IR Transciever)"><img class="alignleft size-medium wp-image-76" style="border: 0pt none;" title="משדר מקלט אינפרה-אדום (IR Transciever)" src="http://www.lirtex.com/he/wp-content/uploads/2010/09/IR-Transciever-300x225.jpg" alt="" width="300" height="225" /></a>במסגרת פרויקט <strong>בית חכם</strong> עליו עבדתי, רציתי להתממשק לרכיבי חשמל המופעלים על ידי תשדורת אינפרה-אדום כך שאוכל לשלוט בהם באמצעות תוכנה מהמחשב. ישנם הרבה מכשירים ביתיים כאלו: הטלוויזיה, ממיר הכבלים, מערכת הסטריאו, המזגן וכדומה. מה שמקשה על התממשקות כזו לרכיבים רבים במקביל הם שלל הפרוטוקולים השונים לתקשורת IR. מבדיקה שרירותית שביצעתי ע&quot;י שימוש ב-Scope, לרוב מכשירי החשמל שלי היה פרוטוקול שונה, ובמקרים מסוימים אף היה מדובר בפרוטוקול ייחודי ולא מוכר.</p><p>כדי להתגבר על קושי זה של ריבוי פרוטוקולים או שימוש בפרוטוקולים יעודיים, כתבתי דרייבר לקרנל של לינוקס (Linux Kernel Module) שאליו ניתן להתממשק מכל תוכנת User-Space ולשלוח פקודת Infra-Red כלשהי, ללא תלות בפרוטוקול מסוים.</p><p><span id="more-73"></span></p><h2>למה לינוקס?</h2></div><div dir="rtl">לטעמי לינוקס היא הפלטפורמה המתאימה ביותר למערכות משובצות תוכנה. הקוד פתוח, יש גרסאות זמן אמת (RTAI), דרישות החומרה נמוכות ויכולות הממשוק גבוהות. בנוסף אני עובד ומפתח ללינוקס כבר 12 שנים, כך שהיה לי הרבה יותר קל לכתוב דרייבר ללינוקס.</div><div dir="rtl"><h2>מדוע נדרש Kernel Module?</h2><p>ישנן מספר סיבות לכך שנדרש כאן דריבר יעודי לקרנל (בסדר יורד):</p><p>1.שליחת פקודת IR צריכה להתבצע בזמן אמת, ללא הפסקות כלשהן באמצע התשדורת. עבודה במרחב המשתמש לא יכולה להבטיח בלעדיות של התהליך אפילו לפרק זמן קצר של שליחת פקודת IR (מילי-שניות) בשל Context-Switching ופסיקות המבוצעים כל העת במערכת ההפעלה.<br /> 2.פרוטוקולי Infra-Red עובדים במהירויות שעון גבוהות (מיקרו-שניות לפולס) ולא ניתן להבטיח דיוק כזה במרחב המשתמש.<br /> 3.נוחיות השימוש במודול גדולה לאין שיעור – על המשתמש פשוט לכתוב את הפקודה  ל-Device File, ומערכת ההפעלה תדאג לעבוד מול החומרה. לדוגמה:<br /> “cat AirConditionOn &gt; /dev/irsend”</p><h2>כיצד עובד הדרייבר?</h2><p>המודול מקבל מערך של מספרים המיצגים מיקרו-שניות, כאשר הזוגיים הם משך הזמן שבו לד האינפרה-אדום משדר, והאי-זוגיים הם משך הזמן בו הלד אינו משדר. את רשימת המספרים (שהיא בעצם פקודת ה-IR) מקליטים מראש באמצעות תוכנה המתחברת למעגל שבנית (תיאור המעגל בהמשך).</p><p>לדוגמה, נניח כי אני רוצה להקליט את כל הפקודות שנמצאות על שלט המזגן, מקש &quot;On” להדלקה, מקש &quot;+” המעלה את הטמפרטורה, מקש &quot;מצב קירור&quot; מקש &quot;מצב חימום&quot; וכו'. כל מה שנדרש הוא להעביר את התוכנה למצב הקלטה (בשלב זה התוכנה ממתינה לקבלת תשדורת IR) ולאחר מכן ללחוץ על המקש אותו רוצים להקליט בשלט. כאשר התשדורת מסתיימת התוכנה מבקשת את שם המקש (לדוגמה: “TurnAirConditionOn”) ושומרת את הנתונים לקובץ.</p><p>מכאן, כל מה שנדרש הוא לכתוב את תוכן קובץ הפקודה אל ה-Device File. ניתן אפילו ליצור תסריטים מרכבים, לדוגמה:<br /> 1.&quot;אם הטמפרטורה בבית עולה מעל 28 מעלות&quot; (מבוצע באמצעות פרויקט DATA ACQUISITION)<br /> 1. שלח פקודת &quot;TurnAirConditionOn&quot;<br /> 2.שלח פקודת &quot;SetAirConditionCoolMode”<br /> 3.שלח פקודת &quot;AirConditionTemperatureDown”</p><h2>קוד</h2><pre class="brush: cpp; title: ; notranslate">
/*
 * ircomm.h - InfraRed communication character device definition file
 *
 * Copyright (C) 2006 Lior Chen &lt;liorc@lirtex.com&gt;
 *
 * The source code in this file can be freely used, adapted,
 * and redistributed in source or binary form, so long as an
 * acknowledgment appears in derived source files.  The citation
 * should list that the code was originly written by Lior Chen
 * &lt;liorc@codex.homelinux.net&gt;.
 * No warranty is attached; I cannot take responsibility for errors
 * or fitness for use.
 *
 */

#ifndef _IRCOMM_H_
#define _IRCOMM_H_

#define PDEBUG(fmt, args...) printk(KERN_DEBUG &quot;ircomm: &quot; fmt, ## args)

#define IRCOMM_MAJOR		0       // dynamic major by default
#define IRCOMM_NR_DEVS  	4        // ircomm0 .. ircomm4
#define PORT			0x3F8	 // Serial port
#define DTR_ON			outb(UART_MCR_OUT2|UART_MCR_DTR, PORT + UART_MCR)
#define DTR_OFF			outb(UART_MCR_OUT2, PORT + UART_MCR)
#define BUF_LEN                   256

#ifndef MAX_UDELAY_MS
#define MAX_UDELAY_US    5000
#else
#define MAX_UDELAY_US    (MAX_UDELAY_MS*1000)
#endif

struct ircomm_dev
{
        int **data;          // a pointer to the IR signal (int[])
        unsigned long size;  // number of elements in the IR signal
        struct cdev cdev;    // char device structure
};

/*
 * Prototypes for shared functions
 */
int ircomm_open(struct inode *inode, struct file *filp);
int ircomm_release(struct inode *inode, struct file *filp);
static ssize_t ircomm_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);

static inline void safe_udelay(unsigned long usecs)
{
        while(usecs&gt;MAX_UDELAY_US)
        {
                udelay(MAX_UDELAY_US);
                usecs-=MAX_UDELAY_US;
        }
        udelay(usecs);
}

#endif /* _IRCOMM_H_ */
</pre><pre class="brush: cpp; title: ; notranslate">
/* ircomm.c - InfraRed communication character device module
 *
 * Copyright (C) 2006-2010 Lior Chen &lt;chen.lior@gmail.com&gt;
 *
 * The source code in this file can be freely used, adapted,
 * and redistributed in source or binary form, so long as an
 * acknowledgment appears in derived source files.  The citation
 * should list that the code was originly written by Lior Chen
 * &lt;liorc@codex.homelinux.net&gt;.
 * No warranty is attached; I cannot take responsibility for errors
 * or fitness for use.
 */

#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt;
#include &lt;linux/moduleparam.h&gt;

#include &lt;linux/serial_reg.h&gt;
#include &lt;linux/delay.h&gt;
#include &lt;linux/ioport.h&gt;
#include &lt;linux/fs.h&gt;
#include &lt;linux/types.h&gt;
#include &lt;linux/cdev.h&gt;
#include &lt;asm/uaccess.h&gt;
#include &lt;linux/slab.h&gt;
#include &lt;asm/io.h&gt;
#include &quot;ircomm.h&quot;

// Parameters which can be set at load time
int ircomm_major   = IRCOMM_MAJOR;
int ircomm_minor   = 0;
int ircomm_nr_devs = IRCOMM_NR_DEVS;

module_param(ircomm_major, int, S_IRUGO);
module_param(ircomm_minor, int, S_IRUGO);
module_param(ircomm_nr_devs, int, S_IRUGO);

// Variable declarations
dev_t dev;
struct ircomm_dev *ircomm_devices; /* allocated in ircomm_init_module */

// Module file operations. Currently supports only write.
struct file_operations ircomm_fops =
{
	.owner = THIS_MODULE,
	.write	= ircomm_write,
 	.open	= ircomm_open,
 	.release= ircomm_release,
};

// A buffer to hold the IR square-wave signal. Every odd element is the HIGH length, and every even element is the LOW length in micro seconds.
static int signal[BUF_LEN];

/*
 * Write a square-wave infrared signal to the serial port.
 */
static ssize_t ircomm_write(struct file *filp, const char __user *buf, size_t n, loff_t *f_pos)
{
	int i, count;

	printk(KERN_ALERT &quot;ircomm: ircomm_write()\n&quot;);
	count = n / sizeof(int);

    if (n % sizeof(int))
		return -EINVAL;

	if (count &gt; BUF_LEN)
		return -EINVAL;

	if (copy_from_user(signal, buf, n)) return -EFAULT;

	for (i=0;i&lt;count; i+=2)
	{
		DTR_ON;
		safe_udelay(signal[i]);

		DTR_OFF;
		safe_udelay(signal[i+1]);
	}

	return n;
}

/*
 * Setup a character device. Dynamically allocate major and minor numbers.
 */
static void ircomm_setup_cdev(struct ircomm_dev *dev, int index)
{
	int err, devno;

	printk(KERN_INFO &quot;ircomm: ircomm_setup_cdev()\n&quot;);

 	// Assign major and minor numbers
	devno = MKDEV(ircomm_major, ircomm_minor + index);
	// Initialize character device
	cdev_init(&amp;dev-&gt;cdev, &amp;ircomm_fops);
	// Set device parameters
	dev-&gt;cdev.owner = THIS_MODULE;
	dev-&gt;cdev.ops = &amp;ircomm_fops;
	// Add the device. From now on it is active by the kernel.
	err = cdev_add( &amp;dev-&gt;cdev, devno, 1);

	if (err) 	// Fail gracefully if needed
		printk(KERN_NOTICE &quot;ircomm: error %d occured while adding ircomm%d\n&quot;, err, index);
}

/*
 * Open Device
 */
int ircomm_open(struct inode *inode, struct file *filp)
{
	struct ircomm_dev *dev; /* device information */

	printk(KERN_INFO &quot;ircomm: ircomm_open()\n&quot;);

	// TODO: Should add HW existance tests here.

	// Identify which device is begin opened and link it to the filp struct
	// get the cdev field from the ircom_dev struct using the container_of kernel macro
	dev = container_of( inode-&gt;i_cdev, struct ircomm_dev, cdev );
	filp-&gt;private_data = dev;

	// Trim the length of the device to 0 if open was write only
	/*if ( (filp-&gt;f_flags &amp; O_ACCMODE) == O_WRONLY)
		ircom_trim(dev); //ignore errors*/

	return 0;
}

/*
 * Release device.
 */
int ircomm_release(struct inode *inode, struct file *filp)
{
	kfree(ircomm_devices); // deallocate memory used to the device.
	printk(KERN_ALERT &quot;ircomm: release()\n&quot;);
	return 0;
}

static void __exit ircomm_exit(void)
{
        int i;
        dev_t dev = MKDEV(ircomm_major, ircomm_minor);

        // Get rid of the char device entries
        if (ircomm_devices)
        {
                for (i=0; i&lt;ircomm_nr_devs; i++)
                        cdev_del(&amp;ircomm_devices[i].cdev);
                kfree(ircomm_devices);
                unregister_chrdev_region(dev, ircomm_nr_devs);
        }
        printk(KERN_ALERT &quot;ircomm: module unloaded.\n&quot;);
}

/*
 * Initialize device. Get dynamic major and minor numbers.
 */
static int __init ircomm_init(void)
{
	int result, i;
	dev_t dev=0;

        printk(KERN_ALERT &quot;ircomm: Infrared Transciever v1.0, by Lior Chen &lt;chen.lior@gmail.com&gt;\n&quot;);

	/* get range of minor numbers to work with. Ask for a dynamic major,
	   unless directed otherwise at load time. */
	if (ircomm_major)
	{
		dev = MKDEV(ircomm_major, ircomm_minor);
		// Register character device.
		result = register_chrdev_region(dev, ircomm_nr_devs, &quot;ircomm&quot;);
	}
	else
	{
		result = alloc_chrdev_region(&amp;dev, ircomm_minor, ircomm_nr_devs, &quot;ircomm&quot;);
		ircomm_major = MAJOR(dev);
	}
	if (result &lt; 0)
	{
		printk(KERN_WARNING &quot;ircom: can't get major %d\n&quot;, ircomm_major);
		return result;
	}

	// Allocate the devices. They can't be static as the number can be specified at load time.
	ircomm_devices = kmalloc(ircomm_nr_devs * sizeof(struct ircomm_dev), GFP_KERNEL);
	if (!ircomm_devices)
	{
		result = -ENOMEM;
		ircomm_exit();
		return result;
	}
	memset(ircomm_devices, 0, ircomm_nr_devs * sizeof(struct ircomm_dev));

	// Initialize each device
	for (i=0; i&lt;ircomm_nr_devs; i++)
		ircomm_setup_cdev(&amp;ircomm_devices[i], i);

	dev = MKDEV(ircomm_major, ircomm_minor + ircomm_nr_devs);

	return 0; // success
}

MODULE_DESCRIPTION(&quot;Generic Infrared Transceiver&quot;);
MODULE_VERSION(&quot;1.0&quot;);
MODULE_AUTHOR(&quot;Lior Chen &lt;chen.lior@gmail.com&gt;&quot;);
MODULE_LICENSE(&quot;GPL&quot;);

module_init(ircomm_init);
module_exit(ircomm_exit);
</pre><h2>נספחים</h2><p>דוגמה לפקודת העלאת הווליום בטלוויזה  שלי:<br /> 4562     4436      568      565      618     1621<br /> 616     1623      642     1620      592      515<br /> 643      515      590      515      618      493<br /> 639      488      618     1622      617     1654<br /> 609     1620      616      516      617      490<br /> 641      488      617      515      620      488<br /> 645     1619      593      514      642      489<br /> 617     1623      615      514      618      517<br /> 617      489      643     1619      592      515<br /> 642     1621      591     1647      615      515<br /> 620     1621      615     1623      642     1621<br /> 592    46563     4564     4437      617     1623<br /> 617</p></div></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%93%d7%a8%d7%99%d7%99%d7%91%d7%a8-%d7%9c%d7%9e%d7%a9%d7%93%d7%a8-%d7%9e%d7%a7%d7%9c%d7%98-%d7%90%d7%99%d7%a0%d7%a4%d7%a8%d7%94-%d7%90%d7%93%d7%95%d7%9d-%d7%a9%d7%9c/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>&#8235;בקר USB למנועי סרוו&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%91%d7%a7%d7%a8-usb-%d7%9c%d7%9e%d7%a0%d7%95%d7%a2%d7%99-%d7%a1%d7%a8%d7%95%d7%95/</link> <comments>http://www.lirtex.com/he/embedded/%d7%91%d7%a7%d7%a8-usb-%d7%9c%d7%9e%d7%a0%d7%95%d7%a2%d7%99-%d7%a1%d7%a8%d7%95%d7%95/#comments</comments> <pubDate>Tue, 06 Jan 2009 12:51:34 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[Embedded]]></category> <category><![CDATA[רובוטיקה]]></category> <category><![CDATA[UART]]></category> <category><![CDATA[USB]]></category> <category><![CDATA[בקרת הינע]]></category> <category><![CDATA[מנוע סרוו]]></category> <category><![CDATA[מערכות משובצות]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=83</guid> <description><![CDATA[&#8235;תכנון פיתוח וייצור של בקר לשליטה במנועי סרוו המאפשר לשלוט בעד 9 מנועי סרוו שונים באמצעות חיבור USB סטאנדרטי. אפליקציות ושימושים אפליקציות רובוטיקה רבות דורשות שימוש במספר מנועים במקביל. מספר דוגמאות לכך הן הנעת זרוע רובוטית, שליטה בכיוון הצילום של מצלמת רשת, שליטה בכיוונה של אנטנה לווינית, מנגנוני הנעה לרובוטים שונים וכו'. באמצעות השימוש בבקר [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p dir="rtl"><img style="border: 0pt none;" src="/images/electronics/USB-Servo-Controller/Lirtex_USB_Servo_Controller-640x480.JPG" border="0" alt="USB Servo Controller" width="244" height="200" align="left" />תכנון פיתוח וייצור של בקר לשליטה במנועי סרוו המאפשר לשלוט בעד 9 מנועי סרוו שונים באמצעות חיבור USB סטאנדרטי.</p><p><span id="more-83"></span></p><h3 dir="rtl">אפליקציות ושימושים</h3><p dir="rtl">אפליקציות רובוטיקה רבות דורשות שימוש במספר מנועים במקביל. מספר דוגמאות לכך הן הנעת זרוע רובוטית, שליטה בכיוון הצילום של מצלמת רשת, שליטה בכיוונה של אנטנה לווינית, מנגנוני הנעה לרובוטים שונים וכו'.</p><p dir="rtl"><p dir="rtl">באמצעות השימוש בבקר ניתן לפשט בצורה משמעותית את הבקרה של פרויקטים כאלו &#8211; הבקר מחובר למחשב, ניתן לחבר אליו עד 9 מנועים שונים, ומכאן והלאה השליטה נעשית באמצעות קוד פשוט מאד במחשב (לדוגמה פקודה המקבלת את מספר המנוע להזזה, והזווית הרצויה).</p><p dir="rtl"><p dir="rtl">ניתן לראות מספר דוגמאות בסרטונים הבאים:</p><div><div style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://www.youtube.com/v/cJuNe50uuzk&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/cJuNe50uuzk&amp;hl=en&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/cJuNe50uuzk&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true" data="http://www.youtube.com/v/cJuNe50uuzk&amp;hl=en&amp;fs=1"></embed></object></div><div style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://www.youtube.com/v/d9fc5kzCai0&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/d9fc5kzCai0&amp;hl=en&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/d9fc5kzCai0&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true" data="http://www.youtube.com/v/d9fc5kzCai0&amp;hl=en&amp;fs=1"></embed></object></div></div><p dir="rtl"><h3 dir="rtl">שימוש בבקר בתוכנה</h3><p dir="rtl">לאחר התקנת הדרייברים של הבקר, הבקר יופיע במחשב כיציאה סיריאלית (Serial Port) סטנדרטית.  תכונה זו מאפשרת פיתוח קל ומהיר, הזזת המנועים ושליטה ביציאות שונות פשוטה כמו שליחת פקודת טקסט אל היציאה הסיריאלית!</p><h3 dir="rtl">Drivers ודוגמאות קוד</h3><p dir="rtl">הבקר נתמך במערכות ההפעלה הבאות:</p><div dir="rtl"><ul><li>Windows XP \ Windows 200</li><li>Windows Vista</li><li>Linux</li><li>Mac</li></ul></div><p dir="rtl">בקרוב אצרף  דוגמאות קוד לשימוש בבקר ב- C#\.Net וב-C\C++.</p><h3 dir="rtl">מודל CAD ומעגל מודפס PCB</h3><p><img src="/images/electronics/USB-Servo-Controller/Lirtex_USB_Servo_Controller_Model2.jpg" border="0" alt="בקר מנועי סרוו" width="378" height="305" align="left" /></p><div style="text-align: center;"><img style="border: 0pt none;" src="/images/electronics/USB-Servo-Controller/Lirtex_USB_Servo_Controller-640x480.JPG" border="0" alt="בקר מנועי סרוו" width="350" height="285" align="right" /></div><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><h3 dir="rtl">יתרונות לשימוש בבקר</h3><p dir="rtl">מנועי סרוו כוללים מעגל שליטה פנימה המקבל אות בתדר מסויים ומסובב את ראש המנוע לזווית הנכונה בהתאם. בהרבה מקרים יצירת התדר המתאים ישירות ממרכז המערכת \ המחשב הינה פעולה לא רצויה, הדורשת משאבים ומפריעה לטיפול ברכיבים אחרים במערכת. במקרים כאלו נעדיף ליצור בקר נפרד שיקבל מספר X (כך ש X בין 0-255) ויניע את ראש המנוע ל X/255*360 מעלות. בקר זה ידאג ליצירת האות המתאים למנוע. רצוי מאד להשתמש בבקר כזה כאשר רוצים לחבר מנועי סרוו למחשב. חשבו למשל על הנעת 3 מנועי סרוו, שדורשים פולס של 1 מילישנייה. כמות הפסיקות (Interrupts) שתיווצר תכביד מאד על פעולת המחשב. מנגד כאשר משתמשים בבקר, מדובר בפסיקה אחת בלבד המוציאה את הזווית הרצויה לכל מנוע.</p><p dir="rtl"><h3 dir="rtl">תכונות ומפרט טכני</h3><div dir="rtl"><ul><li>שליטה עד 9 מנועי סרוו במקביל</li><li> 9 יציאות שונות לשימוש כללי</li><li>חיבור סיריאלי RS-232 2400, 9600, 38.4k, 115.2k, N81</li><li>ממשק מחשב: USB2.0 Full Speed</li><li>טווח תנועה למנועי הסרוו: 180 מעלות</li><li>רזולוציה: 1מיקרו-שנייה 0.7 מעלות.</li><li>מימדים: 50&#215;50 מ&quot;מ</li><li>כניסת מתח מנועים: ללא הגבלה בהתאם לנתוני המנוע</li></ul></div><h3 dir="rtl">קישורים</h3><div dir="rtl"><ul><li><a href="%D7%A8%D7%95%D7%91%D7%95%D7%98%D7%99%D7%A7%D7%94/%D7%9E%D7%A0%D7%95%D7%A2-%D7%A1%D7%A8%D7%95%D7%95-servo-%D7%9E%D7%99%D7%93%D7%A2-%D7%A9%D7%99%D7%9E%D7%95%D7%A9%D7%99%D7%9D-%D7%99%D7%AA%D7%A8%D7%95%D7%A0%D7%95%D7%AA-%D7%95%D7%97%D7%A1%D7%A8%D7%95%D7%A0%D7%95%D7%AA-%D7%A9%D7%9C%D7%99%D7%98%D7%94-%D7%95%D7%91%D7%A7%D7%A8%D7%94">מנועי סרוו &#8211; מידע, שימושים, יתרונות וחסרונות, שליטה ובקרה</a></li></ul></div></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%91%d7%a7%d7%a8-usb-%d7%9c%d7%9e%d7%a0%d7%95%d7%a2%d7%99-%d7%a1%d7%a8%d7%95%d7%95/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>&#8235;סקירת ההבדלים בין FPGA (רכיב מיתכנת) ומיקרו-בקר&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%a1%d7%a7%d7%99%d7%a8%d7%aa-%d7%94%d7%94%d7%91%d7%93%d7%9c%d7%99%d7%9d-%d7%91%d7%99%d7%9f-fpga-%d7%a8%d7%9b%d7%99%d7%91-%d7%9e%d7%99%d7%aa%d7%9b%d7%a0%d7%aa-%d7%95%d7%9e%d7%99%d7%a7%d7%a8%d7%95/</link> <comments>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%a1%d7%a7%d7%99%d7%a8%d7%aa-%d7%94%d7%94%d7%91%d7%93%d7%9c%d7%99%d7%9d-%d7%91%d7%99%d7%9f-fpga-%d7%a8%d7%9b%d7%99%d7%91-%d7%9e%d7%99%d7%aa%d7%9b%d7%a0%d7%aa-%d7%95%d7%9e%d7%99%d7%a7%d7%a8%d7%95/#comments</comments> <pubDate>Thu, 16 Oct 2008 00:59:48 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[מאמרים]]></category> <category><![CDATA[FPGA]]></category> <category><![CDATA[מיקרובקר]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=50</guid> <description><![CDATA[&#8235;מאמר העוסק בסקירת ההבדלים בין FPGA ומיקרו בקרים (מיקרו-מעבדים, מיקרו-קונטרולרים). המאמר מציג את הטכנולוגיות השונות, הבדלים בינהן, והיתרונות והחסרונות של כל טכנולוגיה. FPGA או מיקרו-בקר? המאמר הבא עוסק בהצגה קצרה של הטכנולוגיות השונות. לא אכנס בפירוט לאיך הרכיבים עצמם עובדים וכיצד מתבצעת התכנות והצריבה אליהם, אלא אעמוד בעיקר על ההבדלים החשובים למתכנן שרוצה לפתח מוצר [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p><img style="border: 0pt none; margin-left: 15px; margin-right: 15px;" src="/images/articles/electronics/fpga.jpg" border="0" alt="FPGA" hspace="15" width="344" height="251" align="left" />מאמר העוסק בסקירת ההבדלים בין FPGA ומיקרו בקרים (מיקרו-מעבדים, מיקרו-קונטרולרים). המאמר מציג את הטכנולוגיות השונות, הבדלים בינהן, והיתרונות והחסרונות של כל טכנולוגיה.</p><p><span id="more-50"></span></p><h2>FPGA או מיקרו-בקר?</h2><p>המאמר הבא עוסק בהצגה קצרה של הטכנולוגיות השונות.<br /> לא אכנס בפירוט לאיך הרכיבים עצמם עובדים וכיצד מתבצעת התכנות והצריבה אליהם, אלא אעמוד בעיקר על ההבדלים החשובים למתכנן שרוצה לפתח מוצר לא יודע באיזו טכנולוגיה כדאי לו להשתמש.</p><h3>מהו FPGA?</h3><p>FPGA &#8211;  Field Programmable Gate Array הינו רכיב אלקטרוני מתכנת הבנוי כמעגל משולב (Integrated Circuit) המכיל בתוכו מספר רב מאוד של &quot;בלוקים לוגיים&quot; הניתנים לתכנות. בלוקים לוגיים הם אוסף של שעריים לוגיים (כמו שער NOT  ו AND), רכיבים מורכבים יותר כגון בוררים ומפענחים ואף רכיבי זכרון מ flip-lops, בודדים ועד רגיסטרים ובלוקים שלמים של תאי זיכרון.<br /> מעל שכבה זו נמצאת שכבה שבעת צריבת (התוכנית שכתב המשתמש) לרכיב FPGA יוצרת &quot;קשרים&quot; חשמליים בין רכיבים האלה ובין הבלוקים הלוגיים עצמם בהתאם להגדרות שקבע המתכנת ובכך נוצר מעגל חשמלי המתאים לקוד.</p><h3>מהו מיקרו-בקר?</h3><p>מיקרו-בקר (microcontroller) הינו מעגל משולב Integrated Circuit בו ממומשת מערכת שלמה SoC הכוללת יחידת עיבוד, ממשקים חיצוניים, זיכרונות ועוד. זהו רכיב שהחומרה בו קבועה ואנו טוענים אליו קוד לזכרון מיוחד שבזמן ריצה מפוענח ומבוצע.</p><h3>הבדלים</h3><p>ההבדל העיקרי בין שני הטכנולוגיות השונות הוא אופי הריצה. למיקרו-בקר יש תכונות של מעבד. כלומר שבזמן ריצה הקוד נלקח מזכרון מסויים מובא למעבד ושם מפוענח ובהצאם לפקודה מבוצעים חישובים שונים משתנים ערכי הכניסות יציאות ועוד. הפקודות מבוצעות באופן סדרתי אחת אחרי השנייה. אפשר לומר שבזמן נתון רק פקודה אחת מבוצעת ונעשה עיבוד רק על נתון אחד (זוהי הכללה קצת גורפת שאינה מדוייקת אך ממחישה את אופי הפעולה). ברכיב  FPGA לעומת זאת, הקוד לא צריך להיות מפוענח בזמן ריצה, כי הוא כבר &quot;נצרב&quot; על הרכיב ובכך הגדיר את אופן פעולתו. רק המידע משתנה בהתאם לכניסות. כמו כן, לרכיב זה יש אופי מקבילי. כל הבלוקים הלוגיים פועלים לפי אות השעון ומבצעים פעולות לפי המידע המצוי אצלם בכניסות. לכן מידע יכול להיותר מחושב ברכיב זה בכמה מסלולים מקבילים, מה שמאפשר לעשות פעולות מקבליות במהירות גבוהה בהרבה ממיקרו-בקר.</p><h3>שיקולים בבחירה</h3><div><p><strong>שטח</strong>: ברכיב FPGA יכולים להיות מליוני טרנזיסטורים ולכן הם בדרכ כלל גדולים יותר (רכיב ממוצע בגודל של כמה סמ&quot;ר) בעוד שמיקרו-בקרים קטנים יכולים להיות בגודל של כמה מ&quot;מ רבועים)</p><p><strong>דרישות הספק</strong>: מאותה הסיבה, רכיב  FPGA בו מיליוני טרנזיסטורים יצרוך הספק גבוה בהרבה. לכן נמעט לראותם בהתקנים ניידים.</p><p><strong>מהירות</strong>: רכיבי FPGA מגיעים לקצבים של מאות מגה-הרץ בעוד שמיקרו-בקרים סטנדרטיים מסתפקים בעשרות בודדות.</p><p><strong>תכנות</strong>: תכנות מיקרו-בקרים נעשה לרוב בשפת לC או באסמבלר. תכנות ל FPGA נעשה בשפת HDL כגון Verilog או VHDL ולרוב האנשים יראה מסובך יותר.</p><p><strong>מחיר</strong>: רכיב FPGA מודרני יכול לעלות מאות ואף אלפי שקלים (רכיב בודד) בעוד מחיר מיקרו-בקר משוכלל יכול להגיע לעשרות שקלים בלבד, כאשר מיקרו-בקר פשוט יכול לעלות שקלים בודדים בכמויות גדולות.</p></div><div></div><div><h3>אז מה לבחור?</h3></div><p>אם אתם צריכים להתעסק עם אותות מעל 10MHZ או עיבוד אותות תמונה מקביליים, ודרישות הספק פחות חשובות לכם. השתמשו ב FPGA . אחרת, כנראה שהבחירה הנכונה עבורכם היא מיקרו בקר.</p><p>עדיין מבולבלים? לא מצליחים להחליט? לא בטוחים איזה מיקרו מעבד או איזה FPGA מתאים ביותר לאפליקציה שלכם?</p><p>התייעצו בפורומים המתאימים.</p></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%a1%d7%a7%d7%99%d7%a8%d7%aa-%d7%94%d7%94%d7%91%d7%93%d7%9c%d7%99%d7%9d-%d7%91%d7%99%d7%9f-fpga-%d7%a8%d7%9b%d7%99%d7%91-%d7%9e%d7%99%d7%aa%d7%9b%d7%a0%d7%aa-%d7%95%d7%9e%d7%99%d7%a7%d7%a8%d7%95/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>&#8235;אבטחת מיקרו-בקרים ומערכות משובצות תוכנה&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%90%d7%91%d7%98%d7%97%d7%aa-%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%95%d7%9e%d7%a2%d7%a8%d7%9b%d7%95%d7%aa-%d7%9e%d7%a9%d7%95%d7%91%d7%a6%d7%95%d7%aa-%d7%aa%d7%95%d7%9b/</link> <comments>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%90%d7%91%d7%98%d7%97%d7%aa-%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%95%d7%9e%d7%a2%d7%a8%d7%9b%d7%95%d7%aa-%d7%9e%d7%a9%d7%95%d7%91%d7%a6%d7%95%d7%aa-%d7%aa%d7%95%d7%9b/#comments</comments> <pubDate>Wed, 15 Oct 2008 00:26:39 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[מאמרים]]></category> <category><![CDATA[מיקרובקר]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=38</guid> <description><![CDATA[&#8235;מאמר העוסק באבטחת אפליקציות משובצות מיקרו מעבדים, סקירת השיטות השונות להנדסה לאחור (Reverse Engineering) ושיטות לאבטחת התוכנה הנמצאת על המיקרו-מעבד. רקעבמרבית המיקרו-בקרים בפרט ורכיבים מתוכנתים בכלל נשמרת התוכנה שכתב המשתמש על זיכרון פנימי של הרכיב (כיום לרוב FLASH). זיכרון זה ניתן לקריאה ולכן, ניתן לקרוא את התוכנה שנכתבה בחזרה למחשב ובכך לשכפל אותה ואת המוצר. [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><div dir="rtl"><p><img class="alignleft" title="אבטחת מיקרובקרים" src="http://brooknovak.files.wordpress.com/2009/07/network-security.jpg" alt="" width="302" height="226" />מאמר העוסק באבטחת אפליקציות משובצות מיקרו מעבדים, סקירת השיטות השונות להנדסה לאחור (Reverse Engineering) ושיטות לאבטחת התוכנה הנמצאת על המיקרו-מעבד.</p><p><span style="color: #0000ff;"><span id="more-38"></span>רקע</span>במרבית המיקרו-בקרים בפרט ורכיבים מתוכנתים בכלל נשמרת התוכנה שכתב המשתמש על זיכרון פנימי של הרכיב (כיום לרוב FLASH). זיכרון זה ניתן לקריאה ולכן, ניתן לקרוא את התוכנה שנכתבה בחזרה למחשב ובכך לשכפל אותה ואת המוצר.</p><h2><span style="color: #0000ff;">מהן הסכנות?</span></h2><p>חברות משקיעות משאבים עצומים בזמן וכסף בפיתוח מוצרים אלקטרוניים משובצי תוכנה.<br /> מרבית העלות בפיתוח מוצרים אלקטרוניים היא ביצירת המוצר הראשון, כלומר עלות הפיתוח, משכורות המהנדסים והבדיקות והכנת קו היצור. כיום ישנם חברות רבות, בעיקר במזרח הרחוק הלוקחות מוצרים/רכיבים שפיתחו חברות אחרות ומבצעים הנדסה-לאחור (reverse engineering) פעולה בה משחזרים את הסכימה של המעגל החשמלי וערכי הרכיבים מהמוצר עצמו. במקרה ותהליך זה פשוט וזול יותר מתכנון המעגל עצמו, הרי שהיצרן שמעתיק ומזייף יחסוך לעצמו את כל העלויות הגבוהות של הפיתוח ולכן יוכל למכור את המוצר במחיר נמוך משמעותית מהמחיר של המוצר המקורי שהועתק.</p><h2><span style="color: #0000ff;">כיצד מבצעים זאת?</span></h2><p>ניתן לשחזר תכנון של מעגל חשמלי פשוט בקלות יחסית ע&quot;י בדיקת קצרים במעגל ופירוק הרכיבים השונים ובדיקת ערכם במכשירי מדידה שונים (לפעמים אפילו משאירים את הרישום על הרכיבים שמציין את היצרן וערכם) אחד הנקודות הקשות יותר לשיחזור והעתקה היא מעגלים משולבים IC.<br /> גם במידה לא רשום על הרכיב דבר ונראה שלא ניתן לדעת עליו דבר מלבד האריזה ומספר הרגליים, ניתן לזהות את הרכיב ע&quot;י מספר דרכים בהם שילוב של הבנה פונקציונלית של תפקיד הרכיב במעגל, הרצת אפשרויות רבות של כניסות ברגליים השונות ובדיקת ערכים מתקבלים באחרות ואף פתיחת הרכיב והתבוננות בארכיטקטורה הפנימית שלו תחת מיקרוסקופ מתאים.<br /> אחת הנקודות הקשות ביותר לפיצוח היא רכיבים משובצי תוכנה, שכן בהם הפונקציונליות תלוייה בקוד,<br /> וגם אם מגלים את שם היצרן והרכיב, עדיין אי אפשר להעתיק אותו מכיוון שצריך גם את הקוד המתאים.<br /> לכן נושא הגנת הקוד שברכיבים משובצי תוכנה הוא כה חשוב לחברות המפתחות מוצרים, ויעד חשוב לפיצוח לחברות המנסות להעתיק מוצרים קיימים.<br /> סיבה נוספת לפריצת מערכות משובצות תוכנה היא לא רק התוכנה הנמצאת עליהן, אלא גם המידע.<br /> ממירי לווין רבים שומרים בזיכרון המיקרו-בקרים שעליהם את הגדרות ההרשאה לצפייה והזמנת ערוצים בתשלום, כך שמי שיוכל לקרוא את הקוד ואת הנתונים בזיכרון, יוכל לשנות אותם ולהעניק לעצמו צפייה בערוצים רבים בחינם. דבר דומה נכון גם לגבי משחקים בקונסולות משחקים כמו PLAYSTATION הגבלות מהירות נסיעה והתנהגות כלי רכב ועוד.</p><h2><span style="color: #0000ff;">הגנה בסיסית</span></h2><p>נסתכל לדוגמה על מיקרו-מעבדים של חברת MICROCHIP.<br /> ההגנה הבסיסית על הקוד נעשת באמצעות סיבית ברגיסטר ה CONFIGURATION שבה ניתן לבחור באפשרות הגנה על הקוד. אם אפשרות זו סומנה, הקוד שנצרב על המיקרו מעבד לא יתאפשר לקריאה. אחרי על כך מנגנון פנימי במיקרו מעבד (בפשטות ניתן לומר ששער OR בין הביט המייצג את הגנת הקוד לביט הנקרא מהזיכרון יתן 1 תמיד אם הסיבית הגנת הקוד היא 1 (יש הגנה) ואת הביט מהזיכרון אחרת) כך שכדי למנוע העתקה ע&quot;י המשתמש הפשוט, מספיק לבצע את ההגדרה המתאימה.</p><h2><span style="color: #0000ff;">פריצה בסיסית</span></h2><p>הדרך הפשוטה לפרוץ את מנגנון זה, הוא לשנות את סיבית ההגנה בחזרה ל 0.<br /> כיצד עושים זאת? ברכיבים ישנים הייתה חלונית קטנה שאיפשרה את מחיקת הקוד באמצעות אור UV חזק (זוהי דרך למחיקת זיכרונות ישנים שאינם עוד בשימוש היום).  כך, היה ניתן להקרין אור ממוקד על האיזור בו נמצא רגיסטר ה CONFIGURATION ובכך לאפס את סיבית ההגנה ולאפשר את קריאת הקוד. כיום למרות שהחלונית לא קיימת, עדיין ניתן לעשות זאת, על ידי פתיחת מארז הפלסטיק של הרכיב, מציאת האיזור בו נמצאים ה&quot;פיוזים&quot; שקובעים את ערך<br /> ה CONFIGURATION רגיסטר ושימוש באור UV ממוקד. ואכן כך נפרצו מיקרו-מעבדים רבים ונקראה התוכנה מהם.</p><h2><span style="color: #0000ff;">שיפור באבטחה</span></h2><p>הפתרון לבעיית אבטחה זו היא להגן על האיזור בו נמצא ה CONFIGURATION רגיסטר. ניתן &quot;לכסות&quot; איזור זה בשיכבה מתכתית שלא תאפשר לקרני ה UV לחדור. מובן ששכבה זו מיוצר כך שלא ניתן להסירה מבלי להרוס את הרכיב.</p><h2><span style="color: #0000ff;">שיטות פריצה נוספות</span></h2><p>שיטה פשוטה יותר לפריצה היא תכנות ההגדרות של המיקרו-בקר (CONFIGURATION רגיסטר ועוד כמה רגיסטרים של הגדרות) באמצעות צורב שמתח הצריבה שלו הוא גבוה מהמקובל, ובכך &quot;לשרוף&quot; את סיבית ההגנה ולאפשר קריאה של הקוד. דרך פשוטה להתמודד עם שיטה זו היא להרוס את הרגליים באמצעותם מתכנתים את המיקרו-בקר , באמצעות מתח גבוה רגעי. כמובן שאפשרות זו אינה טובה שכן היא לא תאפשר שינויי תוכנה בעתיד (למרות שיש אפשרות לבצע את שינויים אלה אם מותקן Bootloader)ישנם עוד מספר שיטות לפריצה שלא אכנס אליהם במסגרת מאמר זה.</p><h2><span style="color: #0000ff;">איך ניתן להתמודד עם בעיה זו?</span></h2><p>השיטה הטובה ביותר היא להשתמש במיקרו-בקרים שיצאו לשוק בשנים האחרונות, שכם בהם מיושמים מנגנוני הגנה רבים. אחד המנגנוני הגנה החדשים של חברת MICROCHIP הוא ה CODEGUARD &#8211; שיטה בה יש מספר רמות אבטחה לאיזורי זיכרון כך שכל חלקי התוכנית שאינם הגדרות ולא יידרש בהם שינוי עתידי גם בעידכוני תוכנה, נמצאים באיזור זיכרון שלא ניתן לקריאה או כתיבה (פיזית) לאחר הכתיבה הראשונה של הקוד (זכרון ROM). בשיטה זו, איך בכלל גישה לקוד, אך יש אפשרות לעדכוני תוכנה לחלקי קוד שיש אפשרות שישתנו בעתיד. כמו כן ניתן להשתמש בהצפנת הקוד והמידע, כשמפתחות ההצפנה קבועים ונמצאים באיזור שלא ניתן לקריאה ושינוי. מידע נוסף על שיטה זו תוכלו למצוא <a href="http://www.microcontroller.com/news/microchip_codeguard.asp" target="_blank">כאן</a>.</p><p>לשאלות בנושא &#8211; <a href="forums/viewforum.php?f=2&amp;sid=3a896c0799e269e54dd9884ad7415391">פורום אלקטרוניקה</a>.</p></div></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%90%d7%91%d7%98%d7%97%d7%aa-%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%95%d7%9e%d7%a2%d7%a8%d7%9b%d7%95%d7%aa-%d7%9e%d7%a9%d7%95%d7%91%d7%a6%d7%95%d7%aa-%d7%aa%d7%95%d7%9b/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>&#8235;סקירת טכנולוגיות נפוצות בתחום המיקרו-מעבדים \ מיקרו-בקרים&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%a1%d7%a7%d7%99%d7%a8%d7%aa-%d7%98%d7%9b%d7%a0%d7%95%d7%9c%d7%95%d7%92%d7%99%d7%95%d7%aa-%d7%a0%d7%a4%d7%95%d7%a6%d7%95%d7%aa-%d7%91%d7%aa%d7%97%d7%95%d7%9d-%d7%94%d7%9e%d7%99%d7%a7%d7%a8%d7%95/</link> <comments>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%a1%d7%a7%d7%99%d7%a8%d7%aa-%d7%98%d7%9b%d7%a0%d7%95%d7%9c%d7%95%d7%92%d7%99%d7%95%d7%aa-%d7%a0%d7%a4%d7%95%d7%a6%d7%95%d7%aa-%d7%91%d7%aa%d7%97%d7%95%d7%9d-%d7%94%d7%9e%d7%99%d7%a7%d7%a8%d7%95/#comments</comments> <pubDate>Thu, 07 Aug 2008 23:17:12 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[מאמרים]]></category> <category><![CDATA[מיקרובקר]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=34</guid> <description><![CDATA[&#8235;בעבר מיקרו-בקרים הכילו בעיקר מנגנוני קלט-פלט פשוטים, זיכרון ויחידת עיבוד.עם השנים, לא רק שגודל הזכרון גדל משמעותית ומהירות השעון עלתה, אלא שגם נוספו מרכיבים רבים שפעם היו ממומשים ברכיב נפרד חיצוני למעבד. כמו כן, נוספו טכנולוגיות שונות המסייעות לפעילות הבקר, וממשקי תקשורת שונים. כל אלה ממומשים היום על אותה פיסת סיליקון (system on chip). המאמר [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p dir="rtl"><img style="border: 0pt none; margin-left: 15px; margin-right: 15px;" src="/images/articles/electronics/Microcontrollers.jpg" border="0" alt="מיקרו-מעבדים, מיקרו-קונטרולרים, מיקרו-בקרים" hspace="15" align="left" /></p><p dir="rtl">בעבר מיקרו-בקרים הכילו בעיקר מנגנוני קלט-פלט פשוטים, זיכרון ויחידת עיבוד.עם השנים, לא רק שגודל הזכרון גדל משמעותית ומהירות השעון עלתה, אלא שגם נוספו מרכיבים רבים שפעם היו ממומשים ברכיב נפרד חיצוני למעבד. כמו כן, נוספו טכנולוגיות שונות המסייעות לפעילות הבקר, וממשקי תקשורת שונים. כל אלה ממומשים היום על אותה פיסת סיליקון (system on chip). המאמר בא לסקור חלק גדול מהטכנולוגיות שניתן למצוא מימוש שלהם במיקרו-בקרים כיום.</p><p><span id="more-34"></span></p><p dir="rtl"><h3 dir="rtl">שעון המערכת</h3><p dir="rtl">כמו כל מערכת סינכרונית, המיקרו-בקר צריך אות שעון על מנת לסנכרן בין פעולת הרגיסטרים השונים. ישנם מספר אפשרויות למימוש שעון למערכת:</p><p dir="rtl"><strong>שעון RC חיצוני</strong> &#8211; מחברים לרגל המתאימה של הבקר קבל+נגד בטור היוצרים גל בגלל תהליך הפריקה/טעינה של הקבל באמצעות הנגד. שיטה זו זולה שכן היא מצריכה רק שני רכיבים פשוטים אך הדיוק שלה נמוך (תלוי בדיוק הרכיבים) מומלץ להשתמש בשיטה זו ברכיבים בהם אין שעון פנימי ובאפליקציות הדורשות קצב שעון נמוך יחסית ולא חייבות דיוק רב בזמנים.</p><p dir="rtl"><strong>שעון RC פנימי מהיר</strong> &#8211; במרבית המיקרו-בקרים החדשים ממומש שעון RC פנימי. פעילותו זהה לחיצוני רק שהוא ממומש בתוך הרכיב. שימושי בעיקר במערכות בהן אין חשיבות גדולה לדיוק של תזמונים שונים, ויש חשיבות גודלה למיזעור מהערכת. רכיב זה משמש גם כשעון ריצה בעת תחילת המערכת או במקרה של כשל השעון החיצוני.</p><p dir="rtl"><strong>שעון חיצוני מגביש</strong> &#8211; <a href="http://en.wikipedia.org/wiki/Crystal_oscillator">crystal oscillator</a> &#8211; שעון הפועל ע&quot;י שני קבלים, גביש (לרוב קוורץ) ושער NOT ונגד (שני האחרונים ממומשים כבר בתור הבקר) יתרונו הגדול הוא בדיוק הגבוה ובכך שפעילותו כמעט ולא משתנה כתלות בטמפרטורה. זוהי הדרך המקובלת כיום להפקת אות שעון ורוב המערכות משתמשות בה.</p><p dir="rtl"><strong>מקור שעון חיצוני -</strong> לעיתים רוצים שהבקר יהיה בעל תדר שעון שיקבע ע&quot;פ רכיב אחר (יכול להיות בקר אחר למשל) לכן ישנה אפשרות להשתמש באות שעון חיצוני שיחובר לאחד מרגלי המעבד.</p><p dir="rtl"><strong>שעון פנימי איטי</strong> &#8211; שעון RC פנימי נוסף המפיק תדר נמוך מאוד. מטרתו היא לשימוש כשהבקר במצב &quot;שינה&quot; SPLEEP. במיקרו-בקר ממומשים <a href="http://en.wikipedia.org/wiki/PLL">רכיבי PLL</a> המחלקים/מכפילים את התדר ומסייעים לייצב אותו. באמצעותם ניתן ליצור לדוגמה תדר-שעון של 48MHZ באמצעות גביש של 12MHZ ע&quot;י הכפלת התדר ב 4.<br /> כל הגדרות השעונים ואופן פעולתם נעשים באמצעות תוכנה ע&quot;י הגדרות מתאימות לרגיסטרים השולטים בפעולת השעון.<br /> ישנם עוד מנגנונים הממומשים בחומרה כדי להבטיח עבודה תקינה עם השעון:</p><p dir="rtl"><strong>Fail-Safe Clock Monitor</strong> הינו מנגנון המזהה בעייה עם האות השעון החיצוני לבקר (למשל גביש) ומשנה אוטומאטית ובצורה חלקה את השעון הפנימי להיות שעון המערכת.</p><p dir="rtl"><strong>Two Speed Startup</strong> לאחר איתחול הבקר לוקח לשעון החיצוני (שנוצר מהגביש) זמן רב במונחי חומרה להתייצב. כדי לחסוך זמן זה יש מנגנון שמפעיל את המעבד באמצעות השעון הפנימי, ומתחיל להריץ את הקוד. לאחר שהשעות החיצוני מתייצב הוא הופך להיות השעון הראשי לבקר.</p><h3 dir="rtl">מוני זמן Timers</h3><p dir="rtl">מוני זמן שימושיים באפליקציות בהן נדרש לספור זמן בצורה מדוייקת כגון: בקרת מנועים, תקשורת או מדידות שונות. מוני הזמן הם רגיסטרים שכאשר מקפלים פקודה מתאימה הם מתחילים לספור מחזורי שעון ברקע, כלומר ללא התערבות הבקר, והבקר יכול בפקודה מסויימת לבדוק את ערכם. המונים ממומשים בחומרה ורצים באופן עצמאי ולכן אין צורך בפעילות המעבד על מנת לקדם אותם (המעבד ניגש אליהם רק כדי לאתחל אותם, להורות על תחילת הספירה ולבדוק את ערכם. המונה מסוגל לשלוח פסיקה למעבד כאשר הגיע לערך מסויים או שבוצעה גלישה מערכו המקסימאלי. ניתן לבצע חלוקה של תדר השעון, כלומר לקבוע כל כמה מחזורי שעון יקודם המונה ביחידה אחת. לדוגמא מונה של 16 ביט יכול להכיל 64 אלף ערכים. אם נורה למונה זה להתקדם ביחס של 1:256 לשעון המערכת, יוכל המונה לספור עד 16 מליון מחזורי שעון (כשנייה עבור שעון בתדר של 16Mhz) רוב הבקרים ממומש יותר ממונה זמן אחד ע&quot;מ לאפשר פעילות לכמה רכיבים במקביל.</p><h3 dir="rtl">מערכת ניהול הספק</h3><p dir="rtl">מערכת ניהול הספק אחראית על הקצאת הספק לכל אחת מיחידות הבקר ולניהול נכון של משאב זה כדי לא לבזבז הספק כשאי צורך בכך. מיקרו-בקרים רבים נמצאים בהתקנים אלחוטיים הפועלים על סוללות. רבים מהתקנים אלה נמצאים ב&quot;מצב פעולה&quot; באחוז קטן מאוד מהזמן. לדוגמא, שלט רחוק לטלוויזה נמצא בפעולה רק כאשר אנו לוחצים על אחד הכפתורים. במרבית הזמן הוא סתם יושב על השולחן ואינו פעיל. נגן MP4 למשל, גם בזמן שהוא עובד ומשמיע שיר, אינו זקוק לחיבור ה USB שלו, לכן כל אנרגיה שתדרש ע&quot;י רכיב ה USB שבו בזמן זה היא בזבוז. לפיכך ממומשת מערכת ניהול הספק במיקרו-בקרים. לבקר יש מספר מצבי עבודה, מצב רגיל, מצב המתנה idle ומצב שינה sleep. בכל מצב ניתן להגדיר אילו יחידות יפעלו ואילו לא, ומה יהיה מקור השעון של המערכת. למשל, במצב שינה נרצה מינימום דרישת הספק שכן במצב זה ניתן לומר שההתקן לא בשימוש (למרות שהוא לא מכובה לגמרי) מצב זה &quot;נכסה&quot; את מרבית ההתקני תקשורת, או שנעביר גם אותם למצב שינה (מצב שבו הם ידרשו מינימום הספק, אך  יעירו&quot; את המערכת באם תתקבל הודעה בקו התקשורת&quot;. כל שמהירות השעון של הבקר גדולה יותר, כך הוא מבזבז יותר הספק, לכן במצב שינה ננתק את השעון החיצוני ונשתמש בשעון RC הפנימי העובד בתדר נמוך ככל האפשר. שנם עוד אופציות רבות שניתן לשלוט על רובן באמצעות תוכנה ובכך להביא למינימום את צריכת ההספק של הבקר בכך להאריך את משך השימוש של המוצר לפני שתיגמר הסוללה.</p><h3 dir="rtl">זיכרון EEPROM</h3><p>זהו זיכרון ROM הנוסף לזכרון הנתונים הרגיל של המעבד אך יתרונו הוא בכך שאינו נדיף.ֿזיכרון זה נועד לשמור נתונים או טבלאות שאינם חלק מקוד היצרן או שיתתכן שישתנו בעתיד. בזכרון זה לרוב יאוחסנו נתונים על המשתמשים, סיסמאות, ערכים משתנים כמו טבלאות המרה של מטבעות ועוד. עבר השתמשו למטרות אלה בזיכרון EEPROM חיצוני. שילובם של זיכרונות אלה על אותה פיסת סיליקון בתוך המעבד חוסך את השימוש בזיכרונות חיצוניים ולרוב מקצר את זמן הגישה אליהם. זיכרונות אלה לא מיועדים לשמירת מידע כגון תמונות, קבצים. לשמירת נתונים אלה משתמשים היום בזיכרונות FLASH חיצוניים. (יש כיום נסיונות לממש זכרונות FLASH על אותה פיסת סיליקון של הבקר, אך אלה פחות נפוצים ומוצלחים בגלל סיבות טכנולוגיות)</p><h3 dir="rtl">פעולת כפל מבוססת חומרה</h3><p>פעולת כפל היא פעולה ארתמטית הדורשת זמן חישוב רב בגלל שמימושה באמצעות תוכנה הוא באמצעות חיבור. לדוגמא, ביצוע הפעולה 200*213 תידרוש לחבר 200 פעמים את המספר 213 למשתנה (רגיסטר בעל 8 ביט) כלומר תדרוש לולאה שתחזור 200 פעם על פעולת החיבור הבסיסית. באפליקציות בהן יש פעולות הכפלה לעיתים קרובות, הן יגזלו משאבי מערכת רבים. לכן בבקרים רבים ממומשת פעולת כפל בסיסית בחומרה, כלומר ישנו מנגנון המסוגל לבצע הכפלה של רגיסטר ברגיסטר במספר מצומצם של מחזורי שעון. יכולת זו מקנה למיקרו-בקרים רגילים להריץ אפליקציות שמומשו בעבר רק על רכיבי DSP יעודיים. לחברת MICROCHIP ישנה משפחת מיקרו-בקרים dsPIC הלוקחת את נושא הפעולות מתמטיות הממומשת בחומרה צעד אחד קדימה ומהווה פתרון זול ויעיל לאפליקציות רבות של עיבוד אותות שהיו נחלת רכיבי ה DSP בלבד.</p><h3 dir="rtl">פסיקות</h3><p>מנגנון הפסיקות אינו דבר חדש, אך הכנסתי אותו לרשימה מכיוון שכיום יש מגוון רחב מאוד של פסיקות והמנגנון עצמו אינו פשוט כבעבר. מנגנון הפסיקות מאפשר לרכיבים ומערכות שונות בבקר להודיע למעבד CPU שאירעה פעולה מסויימת. ישנו בקר פסיקות המחליט אם להענות לפסיקה זו, ולגרום למעבד להפסיק להריץ את הקוד במקום בו הוא נמצא ולעבור לקטע קוד אחר המטפל בפסיקה. לדוגמה, אחד ההתקנים הפריפריאליים כמו ה USB יכול לשלוח בקשת פסיקה למעבד בזמן שהוא &quot;הרגיש&quot; שהוא חובר למחשב. המעבד מחליט אם לקבל את הפסיקה ואם כן, אז הוא שומר את כל רגיסטרים החשובים לו, ועובר לביצוע קוד הנמצא בכתובת מסויימת המתאימה לטיפול בפסיקה &#8211; במקרה זה קוד המטפל בחיבור של        ה USB. ישנם היבטים רבים למנגנון זה, אך לא אפרט אותם כאן. כיום במיקרו-בקרים יש מספר רב של התקנים ותרחישים המייצרים פסיקות, כגון התקני תקשורת, בעת נפילת מתח, סיום מחזור של מוני הזמן, בעת תקלה באות השעון של המערכת ועוד.</p><h3>CAPTURE/COMPARE/PWM</h3><p>מנגנון זה שימושי באפליקציות בהן יש חשיבות גבוהה לדיוק בתזמון. זהו מודל האמאפשר לבצע פעילויות שמירה/השוואה/פלט כתלות בערכי מוני הזמן של המערכת. אופן הפעילות מוגדר בעת איתחול המודל ולאחר מכן רץ ברקע ללא תקורה מצד המעבד.<br /> <strong>CAPTURE</strong> &#8211; פעולה זו שומרת לרגיסטר בזיכרון את ערך אחד ממוני הזמן כאשר מתרחשת פעולה מסויימת כגון שינוי ערך בכניסה מסויימת. פעולה זו שימושי לאפליקציות בהם רוצים למדוד במדוייק את משך הזמן בהן אחת הכניסות היא ב 1 לוגי וב 0 לוגי &#8211; כלומר בעיקר לניתוח אותות תקשורת שהמידול שלהם נעשה ע&quot;פ הזמן.<br /> <strong>COMPARE</strong> &#8211; פעולה זו משווה בין ערך רגיסטר מסויים לערך של אחד ממוני הזמן ומבצעת פעילות מסויימת כאשר הם שווים (למשל שינוי ערך של אחת היציאות הדיגיטאליות). פעולה זו שימושית אם אנחנו רוצים לגרום ליציאה להיות בערך מסויים לזמן נתון: נקבע את ערך הרגיסטר בהתאם לזמן שאנו רוצים ונאפס את הטיימר. מכאן מובטח לנו שערך היציאה ישתנה כאשר ערך הטיימר יגיע לערך שקבענו.<br /> <strong>PWM -Pulse Width Modulation</strong> &#8211; באמצעות מודל זה ניתן לקבוע תדירות שינוי של ערך אחת היציאות בצורה מדוייקת, כלומר ניתן להגדיר כמה זמן היציאה תהיה גבוהה וכמה נמוכה. זהו מנגנון השימושי מאוד בבקרה על מנועים.</p><h3>תקשורת טורית סינכרונית</h3><p>מודל זה מאפשר לבקר לבצע תקשורת טורית פשוטה המיועדת בעיקר לתקשר עם רכיבים נוספים בסביבת הבקר כגון מתאמים שונים (LCD, ETHERNET, EEPROM ) או כל מעגל משולב אחד הנמצא בסביבת הבקר וממומשת בו אחת משני הפרוטוקולים SPI -Serial Peripheral Interface או פרוטוקול I2C . המודל ממש בחומרה את כל הרגיסטרים והבדיקות שיש לבצע בשביל לממש את פרוטוקולים אלה, כך שהמעבד בלב הבקר צריך רק לרשום לרגיסטר שליחה או לקרוא נתונים מרגיסטר הקבלה.</p><h3>תקשורת טורית סיכרונית/אסיכרונית  USART -Universal Synchronous Asynchronous Receiver Transmitter</h3><p>ממיוש בחומרה של מודל תקשורת כללי, כולל באפרים לכניסות יציאות. באמצעות מודל זה ניתן לממש פרוטקולי תקשורת פשוטים בהם יש קו נפרד לשליחת מידע וקבלת מידע (half duplex) כמו RS-232 ודומיו. במודל ממומשים בחומרה בדיקות זוגיות, stop bit , וקצב קבלת/שליחת הנתונים כך שהמעבד מקבל/שולח את המידע באמצעות השמה פשוטה לרגיסטרי TX/RX. (המודל ממש את השכבות התחתונות במודל OSI)</p><h3>ממיר אנאלוגי לדיגיטאלי ADC</h3><p>במרבית הבקרים היום ממומש ממיר אנאלוגי לדיגיטאלי פנימי בחומרה. יכולת זו מאפשר לממש באמצעותו מערכות שבעבר נדרש להשתמש בהן בממיר חיצוני (יקר יותר, תופס יותר שטח). הממיר מסוגל לדגום אות אנאלוגי ממספר רב של כניסות (בבקרים עם מספר רגליים גבוה). הרזולוציה מגיעה כיום ל 10 ועד 16 ביט לכל דגימה. קצב הדגימה נע בין 50kbps בבקרים ישנים ועד 1Mbps בטובים יותר. (בכל פעם כניסה אנאלוגית אחרת מחוברת אל הדוגם לכן אם יש כמה כניסות אנאלוגיות אז הקצב הכללי יורד). קצב זה מתאים לדגימה של אותות מחיישנים שונים ואפילו אותות דיבור. רמות המתחים שבהם מתבצעת הדגימה יכולה להיות שונה מערך המתח שמקבל הבקר. למשל בקר שעובד על 0-5V יכול לדגום אות אנאלוגי הנע בין 0-10V או 3- ל 3 וולט.</p><h3 dir="rtl">Analog Comparator Module</h3><p>כמעט בכל משפחות המיקרו-בקרים ממומש משווה מתח, אליו מחוברות 2 כניסות אנלוגיות משני רגליים של הבקר. המשווה יכול לתת למעבד חיווי לגבי איזה ערך כניסה גבוה יותר ועוד. (חוסך שימוש ביחידה משווה ברכיב נפרד באפליקציות הנדרשות לכך).</p><h3 dir="rtl">USB</h3><p dir="rtl">ישנם מיקרו-בקרים שממומש בהם בחומרה יחידת USB המתקשרת עם המחשב. ישנם רגיסטרים מיוחדים לשמירת הגדרות האיתחול של ההתקן, ולמימוש מנגנון התקשורת, כמו כן קיים ממיר ל 3.3V לפעולת ה USB . מימוש זה חוסך שימוש ברכיב מיוחד המממש תקשורת USB ומאפשר עבודה בקצבי גבוהים של  480Mbps FULL SPEED USB.</p><h3>Ethernet</h3><p>בדומה ל USB, ישנם מיקרו-בקרים שממומש בתוכם ממשק ETHERNET שמממש את שני השכבות התחתונות של התקשורת בחומרה, ומאפשר לליבת המעבד לקבל את ההודעות המתאימות רק לרכיב. (ממומשת שכבת ה MAC)</p><h3>CAN &#8211; Controller Area Network</h3><p>CAN הינו פרוטוקול תקשורת המשמש בעיקר לתקשורת בסביבה מרובת מיקרו-בקרים. הפרוטוקול הומצא עבור תעשיית הרכב, שבה יש מספר רב של מיקרו-בקרים (בקר מנוע, תאורה, כריות אוויר, מחשב ניווט, מערכת קול, כיוון מראות ועוד). הפרוטוקול מממש BUS עליו ניתן לחבר מספר גדול של מיקרו בקרים ואחראי על הסדר התקשורת בניהם. הפרוטוקול מכיל מנגננוני בקרה ובדיקת שגיאות ולכן שימושי בסביבה רועשת. ישנן סדרות של מיקרו-בקרים בהן ממומש פרוטוקול זה בחומרה.</p><h3>High/Low-Voltage Detect module</h3><p dir="rtl">מנגנון זה מאפשר לבצע בקרה על מתח הפעולה של המיקרו-בקר. ניתן להגדיר באמצעות התוכנה ערך לרגיסטר מסויים בו קובעים רמת מתח מסויימת (למשל ניתן לקבוע 3.8V) במקרה ומתח ההזנה של הבקר VDD מגיע לערך זה, המנגנון ייצר פסיקה שבאמצעות ניתן להגדיר לבקר מה לבצע במקרה זה.  מנגנון זה שימושי למקרים של נפילת מתח פתאומית. במקרה שמקור המתח של הבקר מנותק בצורה פתאומית, הוא יכול להמשיך לפעול עוד כמה מיקרו/מילי שניות (תלוי בקבלים שונים במערכת) בזמן זה הבקר יכול לבצע פעולות חשובות לפני שיפסיק לעבוד כגון שמירה של נתונים חשובים לזיכרון הלא נדיף ֿֿ, או ביצוע נעילה/התראה במערכות אזעקה. לדוגמא, נניח שמתח ההזנה שלנו VDD הוא 5V. ניתן לכוון את המנגנון לערך של 4V. בעת ניתוק המתח לבקר תרד רמת המתח במהירות. כשתגיע ל 4V המנגנון יזהה זאת ויבצע פסיקה. והבקר יעבור לבצע קטע קוד שישמור נתונים שונים. ויהיה לו זמן לבצע זאת עד אשר מתח ההזנה ירד לרמה של כ 2V שבה הבקר  כבר לא יכול לתפקד כראוי.אם מתכננים את קיבולי המערכת ואת הקוד נכון, זמן זה אמור להספיק. שימוש נוסף למנגנון הוא לאפליקציות המשתמשות בסוללה. עם השימוש בסוללה, ערך המתח שהיא מסוגלת לספק יורד. מכיוון שאנו לא רוצים שיווצר מצב שערך זה ירד לרמת נמוכה בה הבקר לא יוכל לתפקד כראוי (דבר שיכול לגרום לו להתקע בצורות שונות או לבצע דברים שלא התכוונו שיבצע) אז ניתן להגדיר שמרמת מתח מסויימת ההתקן יכבה את עצמו, או לעליפין יציג למשתמש הודעה על כך שהסוללה מתרוקנת ויש להחליפה.</p><h3>תהליך ה RESET</h3><p dir="rtl">כדי לבצע הפעלה תקינה של הבקרים ממומשים בחומרה מספר מנגנוניםשמטרתם ליצור איתחול תקין:<br /> <strong>Power on Reset </strong><br /> מנגנון זה אחרי לכן שבעת חיבור הבקר למקור מתח, הוא יעבור למצב RESET. פעולה זו חשובה כדי שהבקר לא יתחיל לעבור עם ערכי רגיסטרים שגויים. כאשר הבקר עובר למצב RESET הוא מתחיל להריץ את הקוד ממקום ידוע ומבצע שורה של פעולות איתחול ולכן חשוב שיתחיל כך.<br /> <strong>Power up Timer</strong><br /> זהו מונה זמן הפועל מהרגע שניתן אות RESET למשך זמן קצר של כמה מילי-שניות. תפקידו הוא להשהות את תחילת פעולת הבקר עד אשר מקור המתח יתייצב<br /> <strong>oscillator Start-up Timer</strong><br /> זהו מונה זמן המופעל עם סיום ה Power-up Timer  ותפקידו לתת לשעון מספיק זמן ע&quot;מ להתייצב ולספק מחזור שעון מדוייק.<br /> <strong>Brown-out Reset -BOR</strong> מנגנון המבצע פעולת RESET כשמתח ההזנהנמוך מערך מסויים שנקבע בתוכנה, ומשאיר את המעבד במצב זה עד שמתח הספק יעלה שוב.<br /> <strong>WatchDog Timer &#8211; WDT</strong> זהו מנגנון שאמור לבצע פעולת RESETבמידה ויש חשש שהמעבד &quot;נתקע&quot; בגלל סיבה מסויימת כמו באג בתוכנה. המימוש הוא באמצעות מונה זמן שניתן לכוון את ערכו. מונה זה מתחיל לרוץ לאחר אתחול הבקר. באם עבר משך זמן מסויים ומונה זה לא אופס, הוא יגיע לערכו המקסימאלי ואז יבצע RESET  למערכת. אם מאפשרים את פעולתו יש לדאוג לאפס אותו בקוד בכל כמה זמן. במקרה והתוכנה מגיעה לקטע קוד בו היא נתקעת (לולאה אינסופית, מצב המתנה לקלט חיצוני שלא מגיע, גלישת זיכרון ועוד) אז מונה ה wathcdog ירוץ עד שיגיע לערכו המקסימלי ואז יאתחל את המערכת ויחזיר אותה למצב יציב.</p><h3>Code Protection</h3><p>כדי להגן על הקוד מפני העתקות, ניתן להגדיר למעבד שלא ניתן יהיה לקרוא את הקוד ממנו. ישנם מספר מנגנוני הגנה על הקוד. ניתן לקרוא על כך <a href="%D7%9E%D7%90%D7%9E%D7%A8%D7%99%D7%9D/%D7%90%D7%91%D7%98%D7%97%D7%AA-%D7%9E%D7%99%D7%A7%D7%A8%D7%95-%D7%91%D7%A7%D7%A8%D7%99%D7%9D-%D7%95%D7%9E%D7%A2%D7%A8%D7%9B%D7%95%D7%AA-%D7%9E%D7%A9%D7%95%D7%91%D7%A6%D7%95%D7%AA-%D7%AA%D7%95%D7%9B%D7%A0%D7%94">במאמר הבא.</a></p><h3>In-Circuit Serial Programming</h3><p>מנגנון המאפשר לצרוב את הקוד לבקר גם לאחר שחובר למעגל משולב, וזאת באמצעות 3 קווים בלבד.</p><h3><p dir="rtl">סיכום</p></h3><p dir="rtl">ישנם עוד מנגנונים רבים הממומשים בחומרה שלא מופיעים במאמר זה כמו בקרה ל LCD , בקרת מנועים ועוד. המגמה כיום היא להכניס כמה שיותר יכולות לתוך הבקר עצמו, שכן זה חוסך שטח, הספק ומוריד בצורה משמעותית את מחירו הסופי של המוצר.</p><div><span style="font-family: Helvetica; font-size: xx-small;"><br /> </span></p><p style="font-size: 12px;" dir="rtl"><span style="font-family: Helvetica; font-size: xx-small;"> שאלות בנושא ניתן להפנות ל<a href="http://www.lirtex.com/he/%D7%A4%D7%95%D7%A8%D7%95%D7%9E%D7%99%D7%9D/">פורום אלקטרוניקה</a>. </span></p></div></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%a1%d7%a7%d7%99%d7%a8%d7%aa-%d7%98%d7%9b%d7%a0%d7%95%d7%9c%d7%95%d7%92%d7%99%d7%95%d7%aa-%d7%a0%d7%a4%d7%95%d7%a6%d7%95%d7%aa-%d7%91%d7%aa%d7%97%d7%95%d7%9d-%d7%94%d7%9e%d7%99%d7%a7%d7%a8%d7%95/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>&#8235;Big Dog &#8211; רובוט ארבע-רגלי שפשוט לא נופל&#8236;</title><link>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/big-dog-%d7%a8%d7%95%d7%91%d7%95%d7%98-%d7%90%d7%a8%d7%91%d7%a2-%d7%a8%d7%92%d7%9c%d7%99-%d7%a9%d7%a4%d7%a9%d7%95%d7%98-%d7%9c%d7%90-%d7%a0%d7%95%d7%a4%d7%9c/</link> <comments>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/big-dog-%d7%a8%d7%95%d7%91%d7%95%d7%98-%d7%90%d7%a8%d7%91%d7%a2-%d7%a8%d7%92%d7%9c%d7%99-%d7%a9%d7%a4%d7%a9%d7%95%d7%98-%d7%9c%d7%90-%d7%a0%d7%95%d7%a4%d7%9c/#comments</comments> <pubDate>Wed, 16 Jul 2008 14:18:29 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[בלוג]]></category> <category><![CDATA[רובוטיקה]]></category> <category><![CDATA[רובוט]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=110</guid> <description><![CDATA[&#8235;כמישהו שחלק מתחומי העניין שלו הם אלקטרוניקה ורובוטיקה יוצא לי לראות הרבה רובוטים, אם ברשת או בצורה פיסית. היום נתקלתי ברובוט מיוחד בעל אינטליגנציה מלאכותית גבוהה כל כך לעומת רמת האינטליגנציה המלאכותית אליה אנחנו רגילים היום, שנראה כאילו מדובר במדע בדיוני. נראה כאילו הרובוט פשוט לא מסוגל ליפול, גם אם הוא הולך על קרח, או [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p><img style="border: 0pt none; margin-left: 10px; margin-right: 10px;" title="רובוט 4 רגלי" src="/images/idoblog/upload/liorc/Big%20Dog.gif" border="0" alt="רובוט 4 רגלי" hspace="10" width="253" height="330" align="left" />כמישהו שחלק מתחומי העניין שלו הם אלקטרוניקה ורובוטיקה יוצא לי לראות הרבה רובוטים, אם ברשת או בצורה פיסית. היום נתקלתי ברובוט מיוחד בעל אינטליגנציה מלאכותית גבוהה כל כך לעומת רמת האינטליגנציה המלאכותית אליה אנחנו רגילים היום, שנראה כאילו מדובר במדע בדיוני. נראה כאילו הרובוט פשוט לא מסוגל ליפול, גם אם הוא הולך על קרח, או שמישהו פשוט בועט בו ומנסה להפיל אותו בכוח.</p><p>לרובוט קוראים <strong>Big Dog</strong>, וכשמו הוא רובוט ארבע-רגלי בגודל של כלב גדול, או פרדת מסע קטנה. הרובוט מסוגל ללכת בשטח קשה, לרוץ, לקפוץ ולעלות במעלה מדרונות תלולים וקשי מעבר. הרובוט מונע ע&quot;י מנוע בעירה המספק אנרגיה למערכת הנעה הידראולית. רגליו של Big Dog בנויות לפי מבניהן של רגלי בהמת משא וגם נראה כאילו הן מתנהגות בהתאם. ברובוט משולב מחשב ששולט בתנועה ומנתח מידע החישנים הרבים בהם משתמש הרובוט &#8211; חיישני לחץ עבור המפרקים, כוח המופעל במפרקים, מגע עם הקרקע, משקל מטען, גירוסקופ, ומערכת ראיה סטריאוסקופית.</p><p><span id="more-110"></span></p><p>הרובוט מפותח ע&quot;י <a href="http://www.bostondynamics.com" target="_blank">Boston Dynamics</a> במימון DARPA.</p><p><strong>מפרט טכני</strong></p><p>מימדי הרובוט: 1 מטר (אורך), 0.75 מטר (גובה) ומשקלו 75 קילוגרם. מהירות ריצה: 6.5 קמ&quot;ש<br /> יכולת טיפוס מדרון בשיפוע של 35 מעלות<br /> יכולת נשיאה של כ-150 ק&quot;ג משא.</p><p>סרטון הדגמה (שימו לב במיוחד להליכה בשלג, על קרח, ולטיפוס על פסולת הלבנים)</p><div style="text-align: center;" dir="rtl"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="src" value="http://www.youtube.com/v/W1czBcnX1Ww&amp;hl=en&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/W1czBcnX1Ww&amp;hl=en&amp;fs=1" allowfullscreen="true"></embed></object></div></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/big-dog-%d7%a8%d7%95%d7%91%d7%95%d7%98-%d7%90%d7%a8%d7%91%d7%a2-%d7%a8%d7%92%d7%9c%d7%99-%d7%a9%d7%a4%d7%a9%d7%95%d7%98-%d7%9c%d7%90-%d7%a0%d7%95%d7%a4%d7%9c/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>&#8235;השוואה בין מיקרו-בקרים מסידרת PIC של חברת Microchip לבין בקרים מסידרת AVR של חברת ATMEL&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%94%d7%a9%d7%95%d7%95%d7%90%d7%94-%d7%91%d7%99%d7%9f-%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%9e%d7%a1%d7%99%d7%93%d7%a8%d7%aa-pic-%d7%a9%d7%9c-%d7%97%d7%91%d7%a8%d7%aa-mic/</link> <comments>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%94%d7%a9%d7%95%d7%95%d7%90%d7%94-%d7%91%d7%99%d7%9f-%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%9e%d7%a1%d7%99%d7%93%d7%a8%d7%aa-pic-%d7%a9%d7%9c-%d7%97%d7%91%d7%a8%d7%aa-mic/#comments</comments> <pubDate>Wed, 25 Jun 2008 22:45:04 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[מאמרים]]></category> <category><![CDATA[ATMEL]]></category> <category><![CDATA[Microchip]]></category> <category><![CDATA[מיקרובקר]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=19</guid> <description><![CDATA[&#8235;מאמר זה סוקר את ההבדלם העיקריים בין שתי סדרות של בקרים מתוכנתים של שתים מהחברות המובילות בשוק בקרי ה 8 ביט &#8211; ATMEL ו-MicroChip. הסקירה תתמקד בקבוצה זו של במיקרו-בקרים המתאפינים במחיר זול יחסית (1-7$), צריכת הספק נמוכה ושטח קטן, והינם בעלי יכולות מגוונות, המספיקות למערכות רבות שאינן דורשות יכולות עיבוד אותות גבוהות. תחילה אסקור [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p><a href="http://www.lirtex.com/he/wp-content/uploads/2010/09/Microchip-VS-Atmel.jpg" rel="lightbox[19]" title="Microchip-VS-Atmel"><img class="alignleft size-full wp-image-20" style="border: 0pt none;" title="Microchip-VS-Atmel" src="http://www.lirtex.com/he/wp-content/uploads/2010/09/Microchip-VS-Atmel.jpg" alt="" /></a></p><p>מאמר זה סוקר את ההבדלם העיקריים בין שתי סדרות של בקרים מתוכנתים של שתים מהחברות המובילות בשוק בקרי ה 8 ביט &#8211; ATMEL ו-MicroChip. הסקירה תתמקד בקבוצה זו של במיקרו-בקרים המתאפינים במחיר זול יחסית (1-7$), צריכת הספק נמוכה ושטח קטן, והינם בעלי יכולות מגוונות, המספיקות למערכות רבות שאינן דורשות יכולות עיבוד אותות גבוהות. תחילה אסקור את ההבדלים העיקריים בין הטכנולוגיות של החברות ולאחר מכן אשווה קריטריונים שונים בין שני רכיבים דומים משתי החברות.</p><p><span id="more-19"></span></p><h2>ארכיטקטורת מעבד</h2><h3 dir="rtl"><strong>זיכרון</strong></h3><p dir="rtl">זיכרון הנתונים במעבדי PIC מחולק לבנקים שונים (כתלות בגודל הזיכרון) מה שמצריך שינוי של מצביע הבוחר את הבנק זיכרון הנוכחי איתו עובדים בכל גישה לזיכרון. דבר זה מקשה מאוד כשעובדים עם מבנה נתונים שגולש מגודל הבנק. (כאשר עובדים עם קומפיילר C מנגנון זה &quot;מטופל&quot; ע&quot;י הקומפיילר). ב AVR כל זיכרון ה DATA ניתן לגישה באופן ישיר.</p><h3 dir="rtl"><span class="Apple-style-span" style="font-weight: bold;">מנגנון פסיקות</span></h3><p dir="rtl">לרכיבים ממשפחת AVR יש מנגנון פסיקות משוכלל התומך במספר רב יחסית של פסיקות הממומשות בחומרה,כלומר ארכיטקטורה נפרדת המפעילה רוטינת פסיקה מווקטור יחודי בזיכרון לסוגי פסיקות שונים כגון פסיקות שעונים/ADC/פסיקות ממקור חיצוני ועוד, בעוד שבמעבדים ממשפחת  PIC יש רק שתי רמות של פסיקות: נמוכות וגבוהות, כך שנאלצים שכמה רכיבי מערכת המוציאים פסיקות יפעילו את אותה רוטינת פסיקה, ורק בה יבדק בקוד מקור הפסיקה ובהתאם הטיפול בה.</p><h3 dir="rtl"><span class="Apple-style-span" style="font-weight: bold;">מבנה הרגיסטרים ואוצר פקודות</span></h3><p dir="rtl"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-weight: normal;">ל PIC יש רק גריסטר לשימוש כללי אחד, בעוד של AVR יש 32 רגיסטרים. יתרון זה יכול לקצר חישוב של פעולות מורכבות, שכן ניתן לשמור נתונים זמניים על יותר רגיסטרים ובכך להקטין את מחזורי השעון הנדרשים לפעולה. לרכיבי AVR אוצר פקודות גדול יותר הממומש בחומרה, המתבצעות ב1-2 מחזורי שעון, מה שיכול להאיץ את ביצועי המעבד.</span></span></p><h3>צריכת הספק</h3><p dir="rtl">באופן כללי, בקרים ממשפחת PIC נחשבים בעלי צריכת אנרגיה נמוכה יותר במצב שינה, כלומר עדיפים לשימוש במוצרים בהם נדרש אורך חיי סוללה ארוך (כגון שלטי טלוויזה, שעונים.)</p><h3>מחיר</h3><p dir="rtl">בקרי ממשפחת PIC נחשבים לזולים יותר בכמויות קטנות, לכן נוחים יותר מבחינת עלויות פיתוח ויצור ל מוצרים בכמות קטנה.</p><h3 dir="rtl">צורבים, כלי איתור שגיאות (debug) ופיתוח</h3><p><img class="caption" title="ICD2 Debugger" src="http://www.kdenki.com/dougu/photo/ICD2.jpg" border="0" alt="ICD2 Debugger" width="123" height="116" align="left" /><img class="caption" title="ATMel AVR JTAG" src="http://www.atmel.com/dyn/resources/prod_images/JTAGICE.gif" border="0" alt="ATMel AVR JTAG" width="154" height="135" align="left" /> MicroChip משתמשת בפרוטוקול עצמאי שלה עבור כלי איתור השגיאות שלה (debugger) הנקרא ICD- In Circuit Debugger, בעוד ש ATMEL עושה שימוש בפרוטוקול JTAG הסטנדרטי.</p><p>בנוסף, לרכיבי PIC יש אפשרות לתכנות של עד שלוש נקודות עצירה (BreakPoints) &#8211;  מה שאומר שניתן לראות את מצב הרגיסטרים במערכת רק ב 3 נקודות שונות בכל הרצה. זוהי מגבלה מהותית שמנסיוני האישי מקשה את פעולת איתור השגיאות. בבקרים של חברת ATMEL אין הגבלה כזו הדוקה, כך שתהליך האיתור השגיאות קל משמעותית.</p><h3>סביבת פיתוח וקומפיילרים</h3><p style="text-align: center;"><img class="aligncenter" title="ATMEL AVR Studio" src="http://wiki.msoe.us/_media/ce2800/2800avrstudiod.png" border="0" alt="ATMEL AVR Studio" width="611" height="479" align="left" /></p><p style="text-align: center;"><img class="aligncenter" title="MicroChip's MPLAB" src="http://www.spaceorbit.net/peter/projects/microguard_mark1/pix/mplab_2.jpg" border="0" alt="MicroChip's MPLAB" width="642" height="422" align="left" />חברת MicroChip מציעה את סביבת הפיתוח (IDE) שלה הנקראת MPLAB. בסביבה זו ניתן לעבוד עם קומפיילר אסמבלר חינמי ועם סידרה של קומפילרים לשפת C עבור ארכיטקטורות מעבד השונות &#8211;  C18,C30 הכוללות ספריות נוחות מאוד לשימוש עבור התקנים הפריפריאליים של הבקרים.</p><p dir="rtl">ישנם עוד חברות רבות המציעות קומפיילי C עבור מעבדי PIC כגון HighTech ועוד.<br /> מנסיוני האישי, סביבת פיתוח זו אינה נוחה (ונחותה בהרבה מסביבות פיתוח קוד ל PC כגון סביבת הפיתוח  VisualStudio של מייקרוסופט)</p><p dir="rtl">ATMEL מציעה את סביבת הפיתוח שלה AVR STUDIO  שהיא נוחה למדי, אך קצת כבדה ומסורבלת.<br /> יש גם את IAR שהיא סביבה מצויינת. יש לא מעט קומפילרים ל C עבור בקרי AVR ואף קומפיילר gcc.</p><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><p dir="rtl"><h3>השוואה בין שני רכיבים ספציפיים משתי החברות</h3><p>כדי לבצע את ההשוואה, חיפשתי שני רכיבם ברמות מחירים זהות ובעלי יכולות עיקריות זהות, כך שיהיה ניתן לבצע השוואה נכונה והוגנת בין המשפחות. אומנם אני אשווה כאן בין שני רכיבים ספצפיים, אך מכיוון שמרבית הרכיבים במשפחה מבוססים על טכנולוגית ליבה זהה, ההשוואה הספציפית יכולה להעיד על כלל הרכיבים ממשפחות אלה.</p><p>הקריטריונים המרכזיים שחיפשתי היו:</p><p>1. מחיר בסביבות ה 4$<br /> 2. גודל הזיכרון הפנימי: כמות הקוד שניתן לכתוב לבקר.<br /> 3. ממשק תקשורת מהר &#8211; במידה והחומרה שבליבה הבקר תתממשק למחשב, רצוי שיהיה לה ממשק בעל קצב העברת נתונים גבוה ואמין, לכן בחרתי ברכיבים להם יכולת מובנת לממשק USB.</p><p style="text-align: right;">הרכיבים שבחרתי הם:  ATMega32U של Atmel ו PIC18F4550 של Microchip.</p><p style="text-align: right;">להלן טבלה המפרטת את נפח הזיכרונות והרכיבים הפריפריאלים העיקריים הממומשים בכל אחד מהבקרים:</p><table border="1"><tbody><tr><td><span class="Apple-style-span" style="font-weight: bold;">ATMega32U4</span></td><td><span class="Apple-style-span" style="font-weight: bold;">PIC18F4550</span></td><td style="text-align: left;"><span class="Apple-style-span" style="font-weight: bold;">Microcontroller</span></td></tr><tr><td style="text-align: left;">ATMEL</td><td style="text-align: left;">Microchip</td><td style="text-align: left;">Company</td></tr><tr><td style="text-align: left;">AVR</td><td style="text-align: left;">PIC</td><td style="text-align: left;">Series</td></tr><tr><td style="text-align: left;">32K x 8bit</td><td style="text-align: left;">16K x 16bit</td><td style="text-align: left;">Program Memory</td></tr><tr><td style="text-align: left;">2.5Kbyte</td><td style="text-align: left;">2kbyte</td><td style="text-align: left;">Data Memory &#8211; RAM</td></tr><tr><td style="text-align: left;">26</td><td style="text-align: left;">35</td><td style="text-align: left;">Number of I/O</td></tr><tr><td style="text-align: left;">44TQFP</td><td style="text-align: left;">44TQFP</td><td style="text-align: left;">Package</td></tr><tr><td style="text-align: left;">16Mhz</td><td style="text-align: left;">48Mhz</td><td style="text-align: left;">Speed</td></tr><tr><td style="text-align: left;">16</td><td style="text-align: left;">12</td><td style="text-align: left;">MIPS &#8211; Million instructions/sec</td></tr><tr><td style="text-align: left;">1kByte</td><td style="text-align: left;">2kbyte</td><td style="text-align: left;">EEPROM emory Size</td></tr><tr><td style="text-align: left;">12X 10bit</td><td style="text-align: left;">13X 10bit</td><td style="text-align: left;">Analog To Digital Conversion</td></tr><tr><td style="text-align: left;">1</td><td style="text-align: left;" dir="ltr">1</td><td style="text-align: left;">timers: 8 bit</td></tr><tr><td style="text-align: left;">3</td><td style="text-align: left;">3</td><td style="text-align: left;">timers: 1 bit</td></tr><tr><td style="text-align: left;">4</td><td style="text-align: left;">2</td><td style="text-align: left;">PWM channels</td></tr><tr><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">SPI</td></tr><tr><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">I2C</td></tr><tr><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">USB 2.0 Full Speed 12Mbps</td></tr><tr><td style="text-align: left;">2.7-5.5V</td><td style="text-align: left;">4.2-5.5V</td><td style="text-align: left;">Voltage</td></tr><tr><td style="text-align: left;">1-3uA</td><td style="text-align: left;">0.1-2uA</td><td style="text-align: left;">sleep mode current 5V 25Deg</td></tr><tr><td style="text-align: left;">3.5$</td><td style="text-align: left;">4.1$</td><td style="text-align: left;">Price @ 100qu</td></tr></tbody></table><p>רואים כי אין הבדלים גדולים בין שני הרכיבים. יתרון קל ל PIC בצריכת הספק במצב שינה, ומספר פיני I/O.<br /> יתרון ל AVR בנפח זכרון, בתכנון יותר נכון של ארכיטקטורת ה ADC והטיימרים.</p><h3>סיכום</h3><p>היתרונות הבולטים של רכיבי AVR הם בסביבת פיתוח נוחה יותר, בעיקר בגלל ה debugger המוגבל של MicroChip ובגלל ארכיטקטורת מערכת נכונה יותר.</p><p>היתרונות של מעבדי PIC הם סף כניסה נמוך יותר, צריכת זרם נמוכה, וכמות I/O גדולה יותר לאריזה.</p><p>נראה שאין מנצחת ברורה, ושהשימוש צריך להיות על פי היישום. ובכל זאת, אם עליכם לבחור רק בטכנולוגיה אחת, הייתי ממליץ על בקרי AVR.</p></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%9e%d7%90%d7%9e%d7%a8%d7%99%d7%9d/%d7%94%d7%a9%d7%95%d7%95%d7%90%d7%94-%d7%91%d7%99%d7%9f-%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%9e%d7%a1%d7%99%d7%93%d7%a8%d7%aa-pic-%d7%a9%d7%9c-%d7%97%d7%91%d7%a8%d7%aa-mic/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>&#8235;מנוע סרוו (Servo) &#8211; מידע, שימושים, יתרונות וחסרונות, שליטה ובקרה&#8236;</title><link>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%9e%d7%a0%d7%95%d7%a2-%d7%a1%d7%a8%d7%95%d7%95-servo-%d7%9e%d7%99%d7%93%d7%a2-%d7%a9%d7%99%d7%9e%d7%95%d7%a9%d7%99%d7%9d-%d7%99%d7%aa%d7%a8%d7%95%d7%a0%d7%95%d7%aa-%d7%95%d7%97%d7%a1%d7%a8/</link> <comments>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%9e%d7%a0%d7%95%d7%a2-%d7%a1%d7%a8%d7%95%d7%95-servo-%d7%9e%d7%99%d7%93%d7%a2-%d7%a9%d7%99%d7%9e%d7%95%d7%a9%d7%99%d7%9d-%d7%99%d7%aa%d7%a8%d7%95%d7%a0%d7%95%d7%aa-%d7%95%d7%97%d7%a1%d7%a8/#comments</comments> <pubDate>Wed, 18 Jun 2008 00:45:50 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[רובוטיקה]]></category> <category><![CDATA[בקרת הינע]]></category> <category><![CDATA[מנוע סרוו]]></category> <category><![CDATA[רובוט]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=61</guid> <description><![CDATA[&#8235;מהו מנוע סרוו? מנוע סרוו הוא מנוע זרם ישר (DC Motor) בעל מערכת תמסורת פנימית של גלגלי שיניים ובקרה אלקטרונית על מיקום המנוע. מה שמיחד מנועי סרוו היא העובדה שהם אינם מסתובבים בצורה חופשית כמו מנועי DC, אלא נעים על פי זווית &#8211; לרוב בין 0 ל-180 מעלות. מנועי סרוו פועלים בחוג סגור, כלומר הינם [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><h3 dir="rtl">מהו מנוע סרוו?</h3><p><img style="border: 0pt none;" title="מנוע סרוו" src="/images/electronics/ServoMotors/Servo1.jpg" border="0" alt="מנוע סרוו" width="216" height="227" align="left" /></p><p dir="rtl">מנוע סרוו הוא מנוע זרם ישר (DC Motor) בעל מערכת תמסורת פנימית של גלגלי שיניים ובקרה אלקטרונית  על מיקום המנוע. מה שמיחד מנועי סרוו היא העובדה שהם אינם מסתובבים בצורה חופשית כמו מנועי DC, אלא נעים על פי זווית &#8211; לרוב בין 0 ל-180 מעלות.</p><p dir="rtl">מנועי סרוו פועלים בחוג סגור, כלומר הינם בעלי בקרה על מיקום המנוע, ובעלי יכולת תיקון פערים מהמיקום הרצוי.</p><p dir="rtl"><span id="more-61"></span></p><h3 dir="rtl">שימושים שונים למנועי סרוו ברובוטיקה</h3><p dir="rtl">מנועי סרוו נמצאים בשימוש בסוגים רבים מאד של רובוטים ובניהם זרועות רובוטיות, מכוניות הנשלטות בשלט רחוק, רובוטי-רכב, מטוסים ומסוקים (לשליטה על זווית הכנף \ רוטור). ישנן סיבות רבות לכך שמנועי סרוו נפוצים כל כך באפליקציות רובוטיקה, ובינהן קלות השליטה במנועי סרוו, דרישות האנרגייה הנמוכות (יעילות), הכח הגבוה, רמת מתח TTL, והגודל והמשקל הנמוכים.</p><h3 dir="rtl">יתרונות וחסרונות של שימוש במנועי סרוו</h3><p dir="rtl">מנועי סרוו שימושיים מאד עבור אפליקציות רובוטיקה, בשל סיבות רבות:</p><div dir="rtl"><ul><li>לרוב מנועי סרוו הינם מנועים בעלי גודל פיזי קטן</li><li>מנועי סרוו מספקים כח זוויתי (מומנט) חזק מאד בהשוואה לגודלם</li><li>מנועי סרוו פועלים בחוג סגור ולכן נחשבים אמינים מאד</li><li>למנועי סרוו יש מעגל שליטה ובקרה פנימי</li><li>מנועי סרו צורכים זרם בצורה פרופורציונאלית למטען אותו הם נושאים (לכן סרוו שאינו נושא מטען רב לא יצרוך הרבה זרם)</li><li>מנועי סרוו פועלים במתח נמוך יחסית (כ-4 עד 6 וולט)</li></ul></div><div dir="rtl"><h3>השוואה בין מנועי סרוו (Servo) למנועי צעד (Step Motors)</h3><ul><li>ההבדל העיקרי בין מנועי צעד למנועי סרוו הוא שמנועי צעד פועלים בחוג פתוח ומנועי סרוו פועלים בחוג סגור, כך  שהמערכת מחוברת למקודד שמבצע תיקוני מיקום כל הזמן. מנועי צעד לא נדרשים לבצע תיקון במיקומם (היות והם יודעים מראש היכן הם נמצאים) כל עוד והם פועלים בטווח העומס המוגדר להם.</li><li>לרוב מנועי סרוו ינועו בטווח זוויות מוגבל (0-180 מעלות) ונדרש להמירם ידנית כך שיוכלו לנוע בטווח רחב יותר של מעלות (360 ומעלה לסיבובים מלאים). מנועי צעד אינם מוגבלים בתנועה.</li><li>מנועי צעד לרוב זולים יותר ממנועי סרוו.</li><li>מנועי צעד מאבדים כח במהירוית גבוהות.</li></ul></div><h3 dir="rtl">כיצד עובד מנוע סרוו?</h3><h3 dir="rtl">כיצד שולטים במנוע סרוו?</h3><p dir="rtl">שליטה במנועי סרוו מבוצעת על ידי שליחת אות דיגיטאלי אל חוט הבקרה של המנוע. הרעיון הכללי הוא שליחת גל מרובע (Square Wave) אל המנוע, כאשר <strong>אורך הגל</strong> הוא זה שקובע את הזווית אליה ינוע המנוע.</p><p dir="rtl">לדוגמה, כאשר נספק למנוע גל בו רוחב הפולס הוא  1מילי-שנייה, המנוע ינוע אל זוויתו המינימאלית &#8211; 0 מעלות.<br /> כאשר נספק למנוע גל בו רוחב הפולס הוא 1.5 מילי-שנייה, המנוע ינוע אל זוויתו האמצעית &#8211; 90 מעלות.<br /> כאשר נספק למנוע גל בו רוחב הפולס הוא 2 מילי-שנייה, המנוע ינוע אל זוויתו הגדולה ביותר &#8211; 180 מעלות.</p><p dir="rtl">תרשים סכמטי:</p><p dir="rtl"><p dir="rtl"><img style="border: 0pt none;" title="אות שליטה במנוע סרוו" src="/images/electronics/ServoMotors/ServoMotorControl.png" border="0" alt="אות שליטה במנוע סרוו" width="640" height="345" /></p><p dir="rtl">בסרטון הבא ניתן לראות הדגמה של השליטה במנוע. שימו לב לאורך הגל המוצג במשקף התנודות (אוסילוסקופ), ולזווית המנוע המשתנה בהתאם</p><p dir="rtl"><div><div style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://www.youtube.com/v/L7tRjtk1kQw" /><param name="src" value="http://www.youtube.com/v/L7tRjtk1kQw" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/L7tRjtk1kQw" data="http://www.youtube.com/v/L7tRjtk1kQw"></embed></object></div></div><h3 dir="rtl">מתח מנועי סרוו</h3><p dir="rtl">מנועי סרוו עובדים בטווח שונה של מתחים, ובדרך כלל בין 4.8 ל-6 וולט. הסיבה לשימוש בסטנדרט הזה היא הקרבה לרמת TTL (שהיא 5 וולט)  שבה פועלים רוב המקרו-מעבדים שמשמים לשליטה על מנועי הסרוו.</p><p dir="rtl">אם כן, באיזה מתח מומלץ להשתמש? שימוש במתח המירבי איתו מסוגל המנוע לעבוד יניב את הכח החזק ביותר.</p><h3 dir="rtl">זרם מנועי סרוו</h3><h3 dir="rtl">חיווט מנועי סרוו</h3><p dir="rtl">לכל מנועי הסרוו יש שלושה חוטים:</p><p dir="rtl">חוט שחור או חום שהוא אדמה (-)</p><p dir="rtl">חוט אדום שהוא המתח (+)</p><p dir="rtl">חוט צהוב, כתום או לבן שהוא חוט האות לשליטה במנוע.</p><p dir="rtl">לדוגמה במנועי הסרוו הנפוצים של Hitec \ Futaba :</p><p dir="rtl"><div style="text-align: center;"><img style="border: 0pt none;" title="חיווט מנוע סרוו" src="/images/electronics/ServoMotors/HiTec-Servo-Motor-Connector.gif" border="0" alt="חיווט מנוע סרוו" width="237" height="190" /><img style="border: 0pt none;" title="חיבור מנוע סרוו" src="/images/electronics/ServoMotors/Futaba-Servo-Motor-Connector.jpg" border="0" alt="חיבור מנוע סרוו" vspace="50" width="150" height="130" /></div><h3 dir="rtl">בניית בקר למנוע סרוו</h3><p dir="rtl">כאמור, מנועי סרוו כוללים מעגל שליטה פנימה המקבל אות בתדר מסויים ומסובב את ראש המנוע לזווית הנכונה בהתאם. בהרבה מקרים יצירת התדר המתאים ישירות ממרכז המערכת הינה פעולה לא רצויה, הדורשת משאבים ומפריעה לטיפול ברכיבים אחרים במערכת. במקרים כאלו נעדיף ליצור בקר נפרד שיקבל מספר X (כך ש X בין 0-255) ויניע את ראש המנוע ל X/255*360 מעלות. בקר זה ידאג ליצירת האות המתאים למנוע. רצוי מאד להשתמש בבקר כזה כאשר רוצים לחבר מנועי סרוו למחשב. חשבו למשל על הנעת 3 מנועי סרוו, שדורשים פולס של 1 מילישנייה. כמות הפסיקות (Interrupts) שתיווצר תכביד <strong>מאד</strong> על פעולת המחשב. מנגד כאשר משתמשים בבקר, מדובר בפסיקה אחת בלבד המוציאה את הזווית הרצויה לכל מנוע.</p><p dir="rtl">פרטים נוספים על הבקר ניתן לקרוא בעמוד <a href="index.php/usb-servo-controller">בקר מנועי סרוו</a>.</p><p dir="rtl"></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/%d7%a8%d7%95%d7%91%d7%95%d7%98%d7%99%d7%a7%d7%94/%d7%9e%d7%a0%d7%95%d7%a2-%d7%a1%d7%a8%d7%95%d7%95-servo-%d7%9e%d7%99%d7%93%d7%a2-%d7%a9%d7%99%d7%9e%d7%95%d7%a9%d7%99%d7%9d-%d7%99%d7%aa%d7%a8%d7%95%d7%a0%d7%95%d7%aa-%d7%95%d7%97%d7%a1%d7%a8/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>&#8235;תכנות רכיבי SMT&#8236;</title><link>http://www.lirtex.com/he/%d7%91%d7%9c%d7%95%d7%92/%d7%aa%d7%9b%d7%a0%d7%95%d7%aa-%d7%a8%d7%9b%d7%99%d7%91%d7%99-smt/</link> <comments>http://www.lirtex.com/he/%d7%91%d7%9c%d7%95%d7%92/%d7%aa%d7%9b%d7%a0%d7%95%d7%aa-%d7%a8%d7%9b%d7%99%d7%91%d7%99-smt/#comments</comments> <pubDate>Wed, 11 Jun 2008 13:39:21 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[בלוג]]></category> <category><![CDATA[SMT]]></category> <category><![CDATA[מיקרובקר]]></category> <category><![CDATA[מעגל אלקטרוני]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=108</guid> <description><![CDATA[&#8235;בזמן האחרון עברתי לשימוש כמעט בלעדי ברכיבי SMT. לרכיבים אלו יש יתרונות רבים, החל מהשטח המועט שהם תופסים, המחיר המופחת, והאלגנטיות של המעגל הנוצר.בנוסף אם מדובר במעגל שהוא אב-טיפוס ומיוצר &#34;ידנית&#34; ולא על ידי מכונה, השימוש ברכיבי SMT חוסך את קידוח החורים שנדרש ברכיבי Through Hole. למרות היתרונות הנ&#34;ל המעבר לשימוש ברכיבי SMT יוצר כמה [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><div><img class="alignleft" style="border: 1px solid black;" title="מתאם SMT ל-DIP" src="http://www.logicalsys.com/prodpics/soic-programming-adapter-150.jpg" border="1" alt="מתאם SMT ל-DIP" width="320" height="234" /></div><p dir="rtl">בזמן האחרון עברתי לשימוש כמעט בלעדי ברכיבי SMT. לרכיבים אלו יש יתרונות רבים, החל מהשטח המועט שהם תופסים, המחיר המופחת, והאלגנטיות של המעגל הנוצר.בנוסף אם מדובר במעגל שהוא אב-טיפוס ומיוצר &quot;ידנית&quot; ולא על ידי מכונה, השימוש ברכיבי SMT חוסך את קידוח החורים שנדרש ברכיבי Through Hole.</p><p dir="rtl">למרות היתרונות הנ&quot;ל המעבר לשימוש ברכיבי SMT  יוצר כמה קשיים, אחד מהם הוא תכנות רכיבי SMT כדוגמת מיקרו-מעבדים. בניגוד לרכיבי SMT שלא דורשים תכנות ולכן רק צריך להלחים אותם למעגל, רכיבים מתוכנתים אלו דורשים שלב מקדים של צריבת קוד התוכנה לרכיב. בניגוד לרכיבי DIP שאותם פשוט ניתן להכניס לשקע ה-DIP של הצורב ולצרוב את התוכנה, כאן זה בלתי אפשרי. לרכיבי SMT אין רגליים שאפשר להכניס לתושבת, הם עדינים מאד וצריך להתנהג איתם בהתאם.</p><p>אז מה עושים בכל זאת?</p><p><span id="more-108"></span></p><p>יש מספר פתרונות. הפתרון הפשוט ביותר, אבל גם היקר ביותר, הוא לקנות מתאמים (adapters) אליהם ניתן להכניס את רכיב ה-SMT והם ממירים אותו לרכיב Through-hole (DIP) רגיל.</p><p>ממירים כאלו קיימים עבור תצורות שונות של רכיבים, החל מ-SOIC, QFN וכו'.</p><p dir="rtl"><div style="text-align: center;"><img title="מתאם SMT ל-DIP" src="http://www.logicalsys.com/prodpics/soic-programming-adapter-150.jpg" border="1" alt="מתאם SMT ל-DIP" width="320" height="234" /></div><div style="text-align: center;">(דוגמה למתאם SOIC)</div><div style="text-align: center;"><img title="מתאם QFN" src="http://www.logicalsys.com/prodpics/32pin-qfp-programming-adapter.jpg" border="1" alt="מתאם QFN" width="320" height="395" /></div><div style="text-align: center;">(דוגמה למתאם QFN)</div><p style="text-align: center;"><img class="aligncenter" src="http://www.logicalsys.com/prodpics/plcc-smt-package-converter-adapter.jpg" alt="" width="320" height="274" /></p><p dir="rtl"><p dir="rtl">טווח המחירים הוא די גדול, החל מדולרים בודדים למתאם פשוט ל-SOIC ועד מאות דולרים עבור מתאמי QFN. לי יש מספר מתאמים עבור מעבדי אלטרה (Altera) בתצורות QFN.</p><p dir="rtl"><p dir="rtl">פתרון נוסף הוא יצירת Header על המעגל המודפס שיאפשר תכנות של הרכיב לאחר שכבר הולחם למעגל. החסרון בפתרון זה הוא השטח שתופס ה-header  &#8211; יוצא שכל השטח שהורווח עקב השימוש ברכיב SMT הופסד עבור ה-Header. היתרון הוא אפשור של עדכון גרסת Firmware ישירות לתוך המעגל.</p><p dir="rtl"><div style="text-align: center;"><img src="http://www.airborn.com.au/8051/proghdr2.gif" border="1" alt="Programming Header" width="460" height="223" /></div><div>(דוגמה לסכמה של header היושב על ה-PCB)</div><p dir="rtl"><p dir="rtl">פתרון אפשרי נוסף, שלא עולה מאות דולרים הוא הלחמת חוט Wire-wrap לרגלי הרכיב, תכנות שלו, הסרת החוטים המולחמים, והלחמת הרכיב למעגל. בדוגמה הזו ניתן לראות רכיב PIC12F629 SOIC שצרבתי בצורה הזו.</p><p dir="rtl"><div style="text-align: center;"><img title="תכנות PIC12F629" src="/images/idoblog/upload/liorc/smt_programming.jpg" border="1" alt="תכנות PIC12F629" /></div><p>קצת סיזיפי אבל לא עולה מאות דולרים ועושה את העבודה.</p></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/%d7%91%d7%9c%d7%95%d7%92/%d7%aa%d7%9b%d7%a0%d7%95%d7%aa-%d7%a8%d7%9b%d7%99%d7%91%d7%99-smt/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>&#8235;בקר מכונת CNC עם 3 צירים (מחרטה או כרסומת)&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%91%d7%a7%d7%a8-%d7%9e%d7%9b%d7%95%d7%a0%d7%aa-cnc-%d7%a2%d7%9d-3-%d7%a6%d7%99%d7%a8%d7%99%d7%9d-%d7%9e%d7%97%d7%a8%d7%98%d7%94-%d7%90%d7%95-%d7%9b%d7%a8%d7%a1%d7%95%d7%9e%d7%aa/</link> <comments>http://www.lirtex.com/he/embedded/%d7%91%d7%a7%d7%a8-%d7%9e%d7%9b%d7%95%d7%a0%d7%aa-cnc-%d7%a2%d7%9d-3-%d7%a6%d7%99%d7%a8%d7%99%d7%9d-%d7%9e%d7%97%d7%a8%d7%98%d7%94-%d7%90%d7%95-%d7%9b%d7%a8%d7%a1%d7%95%d7%9e%d7%aa/#comments</comments> <pubDate>Fri, 23 May 2008 12:16:22 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[Embedded]]></category> <category><![CDATA[רובוטיקה]]></category> <category><![CDATA[CNC]]></category> <category><![CDATA[בקרת הינע]]></category> <category><![CDATA[מנוע צעדים]]></category> <category><![CDATA[עיבוד שבבי]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=91</guid> <description><![CDATA[&#8235;תכנון, פיתוח וייצור של בקר אלקטרוני לשליטה ממוחשבת במכונת CNC המופעלת על ידי מנועי צעד. הבקר תומך בשלושה צירים, חיישני ביות ובמפסקי גבול, ומופרד אופטית מהמחשב. הבקר מתוכנן בצורה פשוטה ויעילה ודורש מספר חיבורים פשוטים בלבד. מודל מתוכנן באמצעות מחשב (CAD) לוח מודפס PCB מפרט טכני מערכת בקרה עבור 3 צירים, בשיטת צעד\כיוון, למכונת CNC [...]&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p><img class="alignleft" style="border: 0pt none;" src="/images/electronics/CNC-Controller/Lirtex_CNC_Controller3-320x137.JPG" alt="בקר מכונת CNC" width="320" height="137" /></p><p dir="rtl">תכנון, פיתוח וייצור של בקר אלקטרוני לשליטה ממוחשבת ב<a href="%D7%A8%D7%95%D7%91%D7%95%D7%98%D7%99%D7%A7%D7%94/%D7%91%D7%A0%D7%99%D7%99%D7%AA-%D7%9E%D7%9B%D7%95%D7%A0%D7%AA-cnc-%D7%91%D7%99%D7%AA%D7%99%D7%AA-%D7%9E%D7%9B%D7%95%D7%A0%D7%94-%D7%9C%D7%A2%D7%99%D7%91%D7%95%D7%93-%D7%A9%D7%91%D7%91%D7%99-%D7%9E%D7%97%D7%A8%D7%98%D7%94-%D7%9B%D7%A8%D7%A1%D7%95%D7%9E%D7%AA">מכונת CNC</a> המופעלת על ידי מנועי צעד. הבקר תומך בשלושה צירים, חיישני ביות ובמפסקי גבול, ומופרד אופטית מהמחשב.</p><p dir="rtl"><p dir="rtl"><span id="more-91"></span></p><p>הבקר מתוכנן בצורה פשוטה ויעילה ודורש מספר חיבורים פשוטים בלבד.</p><h3 dir="rtl">מודל מתוכנן באמצעות מחשב (CAD)</h3><div style="text-align: center;"><img style="border: 0pt none;" title="בקר CNC" src="/images/electronics/CNC-Controller/CNC-Controller-Circuit-Model-White1.png" border="0" alt="בקר CNC" width="640" height="351" /></div><div style="text-align: center;" dir="rtl"><h3 dir="rtl">לוח מודפס PCB</h3><p><img style="border: 0pt none;" src="/images/electronics/CNC-Controller/Lirtex_CNC_Controller2-640x480.JPG" border="0" alt="בקר מכונת CNC" width="640" height="329" /></p><p><img style="border: 0pt none;" src="/images/electronics/CNC-Controller/Lirtex_CNC_Controller3-640x480.JPG" border="0" alt="בקר מכונת CNC" width="640" height="274" /></p><h3 style="text-align: right;">מפרט טכני</h3><div style="text-align: right;" dir="rtl"><ul><li>מערכת בקרה עבור 3 צירים, בשיטת צעד\כיוון, למכונת CNC הבנויה ממנועי צעד.</li><li>תמיכה במנועי UniPolar</li><li>בקרה בשיטת חצאי-צעד להשגת דיוק גבוהה יותר</li><li>תקשורת דו-כיוונית עם המחשב באמצעות מחבר המדפסת (LPT)</li><li>הגנה מוחלטת על המחשב המושגת באמצעות הפרדה אופטית של בקר מכונת ה-CNC המחשב</li><li>תמיכה בשלושה חיישני ביות עבור שלושת הצירים</li><li>תמיכה במפסקי גבול</li><li>נגישות לכל יציאות וכניסות ה-LPT הפנויות</li><li>תצוגת סטטוס חיישני הביות ומפסקי הגבול</li><li>מתח מנועים מקסימאלי:55 וולט</li><li>זרם מקסימאלי (עבור כל מנוע): 50 אמפר</li><li>בקרה נפרדת על ידי מיקרו-מעבד ייעודי לכל מנוע</li><li>יכולת ביצוע צעד של עד 35,000 צעדים לשנייה עבור כל ציר</li><li>הכנה לחיבור צלעות קירור לטרנזיסטורים</li><li>מארז בעל קירור (איורור)</li><li>יכולת לעדכון קושחה (firmware)</li><li>יכולת לשליטה על ראש הקידוח (ראש המחרטה)</li><li>תמיכה במנועים בעלי 5,6 ו-8 חוטים</li><li>נתמך על ידי כל תוכנות ה-CNC המרכזיות: LinuxCNC, Mach3, Kcam</li><li>מימדים:רוחב 12.5 ס&quot;מ, עומק 13.5 ס&quot;מ, גובה 6 ס&quot;מ</li></ul></div><div style="text-align: right;" dir="rtl"><h3>מארז בקר מכונת CNC</h3></div><div style="text-align: right;"><ul><li>מחברים חד כיווניים למנועים &#8211; מונע טעויות בחיבור מנועי הצעד לבקר.</li><li>מחבר DB-9 (&quot;סיריאלי&quot;) לחיבור כניסות המכונה אל הבקר. בדרך כלל ישמש לחיבור כניסות מפסקי הגבול אל הבקר.</li><li>כפתור מעצור חרום לעצירה מוחלטת של המכונה במקרה הצורך. הכפתור מואר באדום שהמכונה דולקת.</li><li>מארז מאוורר היטב לפעולה תקינה של הבקר (הגנה על הטרנזיסטורים), באמצעות מאוורר 60 מ&quot;מ.</li><li>חיבור DC 12v סטנדרטי למתח הפעלת הבקר</li><li>מחברי עומס (מחברי ספק מתח שולחני) לחיבור מתח הפעולה של המנועים.</li><li style="text-align: right;">גודל קומפקטי &#8211; רק 20&#215;10 ס&quot;מ</li></ul></div></div><div style="text-align: center;"><img style="border: 0pt none;" src="/images/electronics/CNC-Controller/CNC_Controller_Case-800x600.JPG" border="0" alt="מארז בקר CNC" width="640" height="374" /></div><div><div style="text-align: center;"><img style="border: 0pt none;" src="/images/electronics/CNC-Controller/CNC_Controller_Case2-640x480.JPG" border="0" alt="מארז בקר CNC" width="640" height="448" /></div></div><h3 dir="rtl">דוגמה להגדרות בתוכנת Linux CNC &#8211; EMC2</h3><div style="text-align: center;"><img title="הגדרות CNC" src="/images/robotics/CNC/EMCParportPins.png" border="0" alt="הגדרות CNC" width="618" height="612" /></div><h3 dir="rtl">קישורים</h3><ul><li><a href="%D7%A8%D7%95%D7%91%D7%95%D7%98%D7%99%D7%A7%D7%94/%D7%91%D7%A0%D7%99%D7%99%D7%AA-%D7%9E%D7%9B%D7%95%D7%A0%D7%AA-cnc-%D7%91%D7%99%D7%AA%D7%99%D7%AA-%D7%9E%D7%9B%D7%95%D7%A0%D7%94-%D7%9C%D7%A2%D7%99%D7%91%D7%95%D7%93-%D7%A9%D7%91%D7%91%D7%99-%D7%9E%D7%97%D7%A8%D7%98%D7%94-%D7%9B%D7%A8%D7%A1%D7%95%D7%9E%D7%AA">מכונות CNC</a> &#8211; מידע על מכונות CNC, מבנה, תיב&quot;ם, G-Code, בניית מכונת CNC ביתית</li></ul></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%91%d7%a7%d7%a8-%d7%9e%d7%9b%d7%95%d7%a0%d7%aa-cnc-%d7%a2%d7%9d-3-%d7%a6%d7%99%d7%a8%d7%99%d7%9d-%d7%9e%d7%97%d7%a8%d7%98%d7%94-%d7%90%d7%95-%d7%9b%d7%a8%d7%a1%d7%95%d7%9e%d7%aa/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>&#8235;לוח פיתוח למיקרו-בקרים מסדרת PIC  של חברת MicroChip&#8236;</title><link>http://www.lirtex.com/he/embedded/%d7%9c%d7%95%d7%97-%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9c%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%9e%d7%a1%d7%93%d7%a8%d7%aa-pic-%d7%a9%d7%9c-%d7%97%d7%91%d7%a8%d7%aa-microchi/</link> <comments>http://www.lirtex.com/he/embedded/%d7%9c%d7%95%d7%97-%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9c%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%9e%d7%a1%d7%93%d7%a8%d7%aa-pic-%d7%a9%d7%9c-%d7%97%d7%91%d7%a8%d7%aa-microchi/#comments</comments> <pubDate>Sat, 26 Apr 2008 12:08:02 +0000</pubDate> <dc:creator>&#8235;ליאור חן&#8236;</dc:creator> <category><![CDATA[Embedded]]></category> <category><![CDATA[IR]]></category> <category><![CDATA[LCD]]></category> <category><![CDATA[Microchip]]></category> <category><![CDATA[RS232]]></category> <category><![CDATA[UART]]></category> <category><![CDATA[USB]]></category> <category><![CDATA[לוח פיתוח]]></category> <category><![CDATA[מיקרובקר]]></category><guid isPermaLink="false">http://www.lirtex.com/hex/?p=89</guid> <description><![CDATA[&#8235;בניית לוח פיתוח למיקרומעבדים של חברת MicroChip הכולל יציאות USB, RF, IR, לוח מקשים, תצוגת LCD ועוד&#8236;]]></description> <content:encoded><![CDATA[<div dir="rtl"><p><a href="index.php/pic-development-kit"><img style="border: 0pt none;" title="ערכת פיתוח למיקרו-מעבד" src="/images/electronics/PicDevelopmentKit/PicDevSmall.jpg" border="0" alt="ערכת פיתוח למיקרו-מעבד" width="240" height="180" align="left" /></a></p><p>לוח פיתוח למיקרו-בקרים של חברת MicroChip הכוללת יציאות USB, RS-232, IR, לוח מקשים, תצוגת LCD ועוד.</p><p><span id="more-89"></span></p><h3>למה צריך ערכת פיתוח?</h3><p>על מנת לפתח מוצר שבמרכזו עומד מיקרו מעבד יש בתחילה להגדיר ולבנות את סביבת החומרה של הפרויקט. בדרך כלל סביבה זו תכיל אחד או יותר מהאמצעים הבאים:</p><ul><li><strong>אמצעי קלט</strong> &#8211; לוח מקשים, לחצנים, מתגים, מתגי סיבוב ועוד.</li><li><strong>אמצעי פלט</strong> &#8211;  מסך LCD, תצוגת 7segment, לדים בצבעים שונים, יציאת שמע ועוד.</li><li><strong>אמצעי תקשורת</strong> &#8211; חיבורים להתממשקות לרכיבי חומרה אחרים או מחשב כגון: USB2, חיבור סיריאלי RS232, חיבור ethernet ועוד.</li><li><strong>חיישנים וכניסות אנלוגיות</strong> &#8211; כגון מד טמפרטורה, מד נפח, כניסת שמע ועוד.</li><li><strong>ספק מתח</strong> &#8211; יחידה שתמיר את המתח החיצוני לדרישת ההספק של כל אחד מיחידות האחרות במוצר.</li></ul><p>לפיכך דיאגרמה כללית של מוצר תראה כך:</p><p><img class="centered groove" src="/images/electronics/PicDevelopmentKit/pic_dev_diagram.jpg" border="0" alt="Pic Development Diagram" width="640" height="460" /></p><p><img src="/images/electronics/PicDevelopmentKit/matrix_horror.jpg" border="0" alt="Matrix Horror" width="297" height="222" align="left" /> אחד השלבים החשובים בתכנון מוצר הוא הגדרת אמצעים אלה (מה נחוץ לפרויקט הספציפי), התכנון של המעגל החשמלי וחיבורם למיקרומעבד. רבים מאמצעים אלה נדרשים במספר רב של פרויקטים.<br /> ערכת פיתוח מכירה מימוש של רבים מאמצעים אלה ולכן מעיילת את עבודת הפיתוח.</p><p>יתרונות:</p><ol><li>חוסך עת העבודה הרבה הכרוכה בבנייה של המעגל בכל פעם מחדש על מטריצה.</li><li>חוסך טעויות של חיבור לא נכון של חוטים על המטריצה, שעלול במקרה הטוב לגרום לשגיאות לא ברורות שיקח זמן רב לאתר, ובמקרה הפחות טוב לקצר ושריפה של המיקרו-מעבד.</li><li>מכיוון שהסכמות החשמליות נתונות, כל מה שנותר לעשות זה כתיבת הקוד. בנוסף לכך, בגלל שאופי החיבור לחומרה מוגדר מראש, ניתן להשתמש בספריות תוכנה ללא כל שינוי והתאמור ולכן מקבלים קיצור משמעותי של זמן הפיתוח.</li></ol><h3>יכולות ערכת הפיתוח הבסיסית</h3><p>מבוססת על מיקרומעבד בעל יכולות גבוהות PIC18F4550.</p><ol><li>אספקת מתח:<ol><li>באמצעות מקור מתח DC חיצוני (ספק מתח)</li><li>באמצעות סוללה 9V</li><li>באמצעות מתח מה USB</li><p>המעבר בין מקורות המתח נעשה בצורה אוטומאטית.</ol></li><li>תצוגת LCD 2 שורות, 20 תווים בכל שורה, עם תאורה אחורית</li><li>לוח מקשים 4&#215;4 הכולל מספרים ואותיות (ניתן להכניס מלל בדומה לכתיבה בטלפון נייד)</li><li>שלושה לדים לבקרה על יציאות שונות</li><li>נגד משתנה להדמיית כניסה אנלוגית</li><li>שני לחצנים, ומפסק 2 מצבים.</li><li>ממשק ל USB 2.0 HIGH SPEED</li><li>ממשק סיריאלי לחיבור ליציאת COM RS232</li><li>חיבור לצורב המתאים לצריבת הקוד ללא הוצאת המעבד מהמעגל ICP</li><li>חיבור נוח לכל הרגליים של המיקרו מעבד על מנת לאפשר הוספות נדרשות על מטריצה וממשק חיבור ללחות עזר מתקדמים (בתכנון)</li><li>שעון המערכת ממתנד/גבי/או שעון פנימי של המיקרומעבד</li><li>אפשרות למתאמים שונים, לחיבור רכיבים בעל מספר רגליים שונה מ 6 עד 64 רגליים כולל רכיבי SMD (בנפרד)</li></ol><p>תוספות מתוכננות לערכה המתקדמת (בתכנון)</p><ol><li>ממשק לתצוגות 7segment</li><li>משדר ומקלט IR</li><li>צורב מובנה בלוח פיתוח</li><li>מד מפרטורה</li><li>בקר למנוע</li><li>לחצנים ולדים נוספים</li><li>יחידה לממשק ל  ethernet</li><li>יחידה לחיבור כרטיס זיכרון SD-RAM</li></ol><h3>אז מה הייחוד של הלוח שלנו?</h3><ol><li>בלוח זה ישנם מספר רב של ממשקי תקשורת, והתקני קלט/פלט שלא ניתן למצוא שילוב של כולם על לוח בלוחות אחרים. לדוגמא במקום לקנות שני ערכות פיתוח: אחת בה יש ממשק לUSB ואחת בשביל לוח מקשים/LCD ניתן לקנות ערכה אחת המשלבת את שניהן.</li><p><!--</p><li>עלות ערכת פיתוח ממוצעת + צורב מתאים ומשלוח לארץ גבוה משמעותית מהמחיר שלנו.</li><li>קטעי קוד עם הסברים בעברית</li><p>&#8211;></ol><h3 dir="rtl">סכמת לוח מודפס למעגל</h3><div style="text-align: center;"><img class="centered groove" src="/images/electronics/PicDevelopmentKit/pcb_layout.jpg" border="0" alt="pcb layout" width="640" height="448" /></div><h3 dir="rtl">לוח הפיתוח המלא לאחר ייצור</h3><div style="text-align: center;"><img src="/images/electronics/PicDevelopmentKit/Microchip-Pic-Development-Board-PCB.jpg" border="0" alt="לוח פיתוח ל-MICROCHIP PIC" width="640" height="486" /></div><div style="text-align: center;"><img src="/images/electronics/PicDevelopmentKit/Microchip-Development-Board-2.jpg" border="0" alt="לוח פיתוח ל MICROCHIP PIC" width="640" height="443" /></div><h3 dir="rtl">שאלות ומידע נוסף</h3><p>לשאלות, הערות ומידע נוסף <a href="forums/viewforum.php?f=2">פורום אלקטרוניקה</a>.</p></div>]]></content:encoded> <wfw:commentRss>http://www.lirtex.com/he/embedded/%d7%9c%d7%95%d7%97-%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%9c%d7%9e%d7%99%d7%a7%d7%a8%d7%95-%d7%91%d7%a7%d7%a8%d7%99%d7%9d-%d7%9e%d7%a1%d7%93%d7%a8%d7%aa-pic-%d7%a9%d7%9c-%d7%97%d7%91%d7%a8%d7%aa-microchi/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching using disk: basic
Object Caching 1108/1253 objects using disk: basic

Served from: www.lirtex.com @ 2012-05-18 21:28:18 -->
