Какво предпочитате да правите в часовете по информатика?
- да учите за офис пакети и как се пише на Word
- или да програмирате роботи и да ги научите да мислят.
Възможните начини да програмирате робот на Лего са много. Програмата ви се състои от набор от инструкции за това как да се държи роботът, как да реагира на външния свят, и въобще как да мисли. Разбира се, за да може роботът ви да мисли трябва да го научите. Трябва да изградите неговата “душа”. И тогава започва голямата забава.
Следването на линия (която може да е доста крива и да има доста чупки) е една класическа задача при роботите и може да се реализира по няколко начина. Ще покажа две решения използвайки два езика за програмиране – Mindstorms Education NXT и NXC (“език за програмиране” не е нещо сложно 🙂 ). Дали роботиката с Лего е за малки или за големи, за напреднали или начинаещи всъщност зависи изцяло от подхода.
Последователността на действията е следната:
- роботът се върти в едната посока докато сензорът за светлина не засече черна линия.
- роботът започва да се върти в другата посока докато сензорът за светлина вече не засича черна линия.
Тук бих разказал какво е правилна и обратна посока на въртене в математиката, но да не се отплесвам…
Програмите ще изглеждат по следния начин:
Mindstorms Education NXT – визуален език с големи възможности, лесно достъпен дори и ако нямате никакъв опит с програмирането:
Жълтият блок проверява стойността на сензора за светлина и изпълнява два от зелените блокове. Зелените блокове управляват моторите, като или ги спират или пускат.
Not eXactly C – ако вече имате поне малко опит с програмирането или просто сте силно заинтересувани, този език е доста подходящ и много мощен:
#define SpeedSlow 50
#define SpeedFast 100
int SV;
task main() {
int Threshold1=600;
long t;
// set sensor type and mode
SetSensorType(IN_3, IN_TYPE_LIGHT_ACTIVE);
SetSensorMode(IN_3, IN_MODE_RAW);
while (true) {
// прочитаме стойността на сензора за светлина
SV = SensorRaw(IN_3);
// проверяваме дали сме върху черна линия
if (SV < Threshold1) {
//задаваме на мотор A да се движе бързо, а на мотор B да се движи бавно. Следователно роботът се завърта.
OnFwd(OUT_A, SpeedFast);
OnFwd(OUT_B, SpeedSlow);
}
else {
//задаваме на мотор B да се движе бързо, а на мотор A да се движи бавно. Следователно роботът се завърта.
OnFwd(OUT_A, SpeedSlow);
OnFwd(OUT_B, SpeedFast);
}
}
return
}
А ето и как изглежда в действие:
[youtube=http://www.youtube.com/watch?v=8tivZ73izPE]
#define SpeedFast 100
int SV;
task main() {
int Threshold1=600;
long t;
// set sensor type and mode
SetSensorType(IN_3, IN_TYPE_LIGHT_ACTIVE);
SetSensorMode(IN_3, IN_MODE_RAW);
while (true) {
// прочитаме стойността на сензора за светлина
SV = SensorRaw(IN_3);
// проверяваме дали сме върху черна линия
if (SV < Threshold1) {
//задаваме на мотор A да се движе бързо, а на мотор B да се движи бавно. Следователно роботът се завърта.
OnFwd(OUT_A, SpeedFast);
OnFwd(OUT_B, SpeedSlow);
}
else {
//задаваме на мотор B да се движе бързо, а на мотор A да се движи бавно. Следователно роботът се завърта.
OnFwd(OUT_A, SpeedSlow);
OnFwd(OUT_B, SpeedFast);
}
}
return
}

