הכנת חיישן מגע מלחצן של וידאו

הפורום הראשי, אתר הרובוטיקה הישראלי

המנהלים: אסף פוניס, גיא יונה

הכנת חיישן מגע מלחצן של וידאו

הודעהעל ידי ארבל » ג' ינואר 23, 2007 2:20 pm

האם יש אפשרות להשתמש בכפתור רגיל של וידאו כחיישן נגיעה?
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי אמנון » ג' ינואר 23, 2007 5:55 pm

באופן עקרוני כן
אמנון :shock:
אמנון
רובוטריק
רובוטריק
 
הודעות: 2031
הצטרף: ש' יולי 09, 2005 5:41 pm
מיקום: חיפה

אני שמח לשמוע שאפשר

הודעהעל ידי ארבל » ג' ינואר 23, 2007 10:12 pm

אתה יכול בבקשה להרחיב קצת ולהסביר לי איך... אם יוצאים מהכפתו 2 חוטים, אז אחד מהם מתחבר לשקע ה I\O והשני הולך ל VCC או ל GND... נכון?
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי אמנון » ד' ינואר 24, 2007 8:49 am

נכון
כדי להרחיב אתה צריך להרחיב , אבל בגדול מה שאמרתה , נכון , ואתה בודק את מצב הכניסה, ורואה אם המצב הישתנה. אתה יכול לחבר גם נגד PULL UP או DOWN כך שיהיה לך אות ברור כאשר המקש לחוץ וכאשר הוא לא לחוץ

נ.ב. הכל בהנחה שזה מקש גע/תוק פשוט
אמנון :shock:
אמנון
רובוטריק
רובוטריק
 
הודעות: 2031
הצטרף: ש' יולי 09, 2005 5:41 pm
מיקום: חיפה

אני זקוק לטיפה יותר פרטים...

הודעהעל ידי ארבל » ו' פברואר 02, 2007 6:37 pm

ככה, הלחצן הוא אחן לחצן תוק/גע פשוט. שאלתי היא,
1. האם לחבר ללחצן חוט מה-VCC או מה- GND.
2. לאחר שחיברתי חוט אחד ללחצן, כיצד אני בודק מה המצב שלו? ניסוי וטעייה או שיש דרך יותר בטוחה (אני מזכיר לכם שאני מאד פוחד על הלוח...)
3. רק כדי להיות בטוח... חוט אחד למקור מתח והשני ליציאת I\O נכון?
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי The arctic wolf » ו' פברואר 02, 2007 9:36 pm

שלום ארבל,

1.זה תלוי איזה אות אתה רוצה להכניס לבקר כאשר הלחצן מופעל(אם אתה רוצה שבהפעלה
של הלחצן הבקר יקבל "1" אז חבר ל-VCC ואם אתה רוצה שיקבל "0" חבר לאדמה).

2. אני לא כל כך הבנתי את השאלה,בבקשה תסביר את עצמך יותר טוב.

3. בגדול אתה מחבר חוט אחד לאדמה או VCC ואת השני לפורט של הבקר,
אבל לפני שאתה עושה זאת תוודא 2 דברים:
א. שהפורט יתפקד ככניסה ולא כיציאה.
ב. אם אתה מחבר את הלחצן ל-VCC תוודא שהמתח של ה-VCC הוא לא יותר גבוה
מ-1 לוגי (בדרך כלל זה 5V ).
זה שהרעיון משוגע עוד לא אומר שהוא לא יצליח!
The arctic wolf
רובוטריק
רובוטריק
 
הודעות: 1007
הצטרף: ד' ינואר 26, 2005 12:43 am

תודה.

הודעהעל ידי ארבל » ש' פברואר 03, 2007 2:19 pm

יש לי עוד 2 שאלות:
1. איך אני מוודא שהפורט מתפקד ככניסה ולא כיציאה?
2. איך אני מוודא כמה מתח מגיע לפורט?
תודה
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי The arctic wolf » ש' פברואר 03, 2007 6:29 pm

1. בדרך כלל זה נעשה בתוכנה(בזמן כתיבת הקוד תוכל להגדיר את הפורט ככניסה
או יציאה).
2. תמדוד את המתח ע"י וולטמטר(מד מתח) לפני שאתה מחבר אותו לפורט.
זה שהרעיון משוגע עוד לא אומר שהוא לא יצליח!
The arctic wolf
רובוטריק
רובוטריק
 
הודעות: 1007
הצטרף: ד' ינואר 26, 2005 12:43 am

מה זה נגד pull up או down ?

הודעהעל ידי רובוטה » ב' פברואר 05, 2007 12:25 am

אמנון כתב:נגד PULL UP או DOWN אמנון :shock:

מה זה נגד pull up או down ?
רובוטה
חבר פורום
חבר פורום
 
הודעות: 52
הצטרף: ו' ינואר 12, 2007 12:54 am

שאלה טובה!

הודעהעל ידי ארבל » ב' פברואר 05, 2007 10:57 am

אמנון, מה זה PULL UP ו- DOWN:?:
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי אמנון » ב' פברואר 05, 2007 1:35 pm

ארבל שלום
מדובר בנגדים שמחוברים או לאדמה או ל פלוס , והם מושכים את המתח לאפס או פלוס , כך שנוח יותר לזהות אותם בעזרת הכניסות של הבקר (לדוגמא)
אמנון :shock:
אמנון
רובוטריק
רובוטריק
 
הודעות: 2031
הצטרף: ש' יולי 09, 2005 5:41 pm
מיקום: חיפה

חיברתי חיישן

הודעהעל ידי ארבל » ו' פברואר 16, 2007 9:14 am

חיברתי חיישן שהוא למעשה מפסק קטן רגיל. (תוק\גע) אבל מה שקורה הוא שהוא שולח כל הזמ את הערך 1 בלי קשר למצב שלו (פתוח או סגור). אני חושב שהבעיה היא שהפורט שלו מקבל יותר מ 5V שאם הבנתי נכון, זה 1 לוגי... החוטים של החיישן (שני חוטים) מחוברים לפורט ול- VCC. יש הצעות איך להוריד את המתח שמגיע לפורט?
ארבל
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הודעהעל ידי אמנון » ו' פברואר 16, 2007 12:22 pm

ארבל שלום
תעלה את הקוד שלך לכאן , וננסה לראות אם אפשר להבין מה קורה.
אמנון :shock:
אמנון
רובוטריק
רובוטריק
 
הודעות: 2031
הצטרף: ש' יולי 09, 2005 5:41 pm
מיקום: חיפה

הרי הקוד:

הודעהעל ידי ארבל » ש' פברואר 17, 2007 5:08 pm

#define F_CPU 20000000UL





#include <avr/io.h>





#include <util/delay.h>





void motor_b_fwd(void)

{

PORTB |= (1 << PB1); // IN1=1

PORTD &= ~(1 << PD5); // IN2=0

}


void motor_b_rev(void)

{

PORTB &= ~(1 << PB1); // IN1=0

PORTD |= (1 << PD5); // IN2=1

}

void motor_b_brake(void)

{

PORTB |= (1 << PB1); // IN1=1

PORTD |= (1 << PD5); // IN2=1

}


void pwm0_init(void)

{



TCCR0A = (2 << COM0A0) | (2 << COM0B0) | (3 << WGM00);





TCCR0B = (4 << CS00);







TIMSK0 = 0;



// Enable output on PD5 and PD6 so we get our PWM outputs on the

// LMB1836M motor driver inputs:





DDRD |= (1 << PD6);



// Enable output on PB1 and PB2 so we can set those bits to get

// directional control on the other inputs on the LMB1836M:





DDRB |= (1 << PB2);



// Set our waveforms to zero for the time being: (Zero speed.)



OCR0A = 0;

OCR0B = 0;

}

void motor_init()

{

// Set up the data direction registers so our four control

// pins are outputs:



DDRB |= (1 << PB1) | (1 << PB2);

DDRD |= (1 << PD5) | (1 << PD6);



// Set both motor to coast



PORTB &= ~(1 << PB2);



PORTD &= ~(1 << PD6);

}



void pwm0_a(int speed)

{

if (speed > 0)

{

// Forward



// Turn off PB2

PORTB &= ~(1 << PB2);

// Clear compare mode for PWM0A and set to clear on compare

// match, set at bottom:

TCCR0A = (TCCR0A & ~(3 << COM0A0)) | (2 << COM0A0);

// Set our PWM duty cycle

OCR0A = speed;

}

if (speed == 0)

{

// Disconnect PWM from 0C0A:

TCCR0A &= ~(3 << COM0A0);

// Set outputs to zero to coast

PORTD &= ~(1 << PD6);

PORTB &= ~(1 << PB2);

// No PWM duty cycle to set

}

if (speed < 0)

{

// Reverse



// Turn on PB2

PORTB |= (1 << PB2);

// Clear compare mode for PWM0A and set to set on compare

// match, clear at bottom:

TCCR0A = (TCCR0A & ~(3 << COM0A0)) | (3 << COM0A0);

// Set our PWM duty cycle

OCR0A = -speed;

}

}



void pwm0_a_brake(void)

{

// Set motor speed to zero (turns off PWM):

pwm0_a(0);

// Enable both PD6 and PB2 to hit the brakes (POWER HUNGRY):

PORTD &= ~(1 << PD6);

PORTB &= ~(1 << PB2);

}



void delay_sec(unsigned char sec)

{

unsigned int cycles;



// Delay 25ms at a time (38.4ms is the most we can delay with a

// 20MHz processor, unfortunately. See the delay.h include file

// for more info.)



for(cycles = 0; cycles < (sec * 40); cycles ++)

{

_delay_ms(25);

}

}

//If the robot bumps into something
void bump(void)
{
motor_b_fwd();
pwm0_a(-100);
delay_sec(2);

motor_b_brake();
}

int main(void)

//create a variable to hold the sensor reading
unsigned int Bump;
{

// Make sure all our registers are clear

DDRB = 0;

DDRC = 0;

DDRD = 0;



// Make sure all our pull-up resistors are clear

PORTB = 0;

PORTC = 0;

PORTD = 0;



// Initialize the timer0 PWM system:



pwm0_init();

// Initialize motor B

motor_init();


// Motors are stopped when we initialize them, so there's

// no need to do that after the init routine.

Bump = 0;
//making port D3 as input
DDRD &= ~(1 << 3);

// The endless loop



for(;;)

{
//Making sure that Bump is 0
Bump = 0;
Bump = (PIND & (1 << 3)) >> 3;

if (Bump==0)
{
bump();
}


// Both motors half forward

pwm0_a(127);

pwm0_b(127);

delay_sec(1);



// Both motors full forward

pwm0_a(255);

pwm0_b(255);

delay_sec(1);



// Coast to a stop

pwm0_a(0);

pwm0_b(0);

delay_sec(2);



// Both motors two-thirds reverse

pwm0_a(-192);

pwm0_b(-192);

delay_sec(1);



// Both motors full reverse

pwm0_a(-255);

pwm0_b(-255);

delay_sec(1);



// Brake to a stop

pwm0_a_brake();

pwm0_b_brake();

delay_sec(2);



}



// We never get here, but return a zero if we ever do.

return(0);

}

[/code][code][/code]
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

קוד נוסף

הודעהעל ידי ארבל » א' פברואר 18, 2007 2:03 pm

על מנת לבדוק אם החיישן עובד באופן כללי, הכנסתי את הקוד הבא:
[code]#include <avr/io.h>

int main(void)
{
// Set all of DDRD lines as inputs
DDRD = 0;

// Make sure PD3 is an input
DDRD &= ~(1 << 3);

// Make sure PD1 is an output
DDRD |= (1 << 1);

// Endless loop
for(;;)
{
// If PIND3 is not zero
if(PIND & (1 << 3) > 0)
{
// Turn on the LED
PORTD |= (1 << 1);
} else {
// Turn off the LED
PORTD &= ~(1 << 1);
}
}
// We never get here
return 0;
}

[code]

הקוד הזה אמור לבדוק את מצבו של החיישן ולהדליק LED שמובנה בלוח הבקרה. גם זה לא עובד... החיישן הוא מפסק רגיל, עדיין, רגל אחת שלו מחוברת ל PD3 והשנייה ל VCC. למה לדעתכם זה לא עובד? האם הבעיה היא בחיישן או בקוד או בחיבורים ללוח?[/code]
סמל אישי של המשתמש
ארבל
חבר פורום
חבר פורום
 
הודעות: 143
הצטרף: א' ינואר 07, 2007 9:37 pm

הבא

חזור אל פורום הרובוטיקה

מי מחובר

משתמשים הגולשים בפורום זה: אין משתמשים רשומים ו 5 אורחים

cron