Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // begin license header
- //
- // This file is part of Pixy CMUcam5 or "Pixy" for short
- //
- // All Pixy source code is provided under the terms of the
- // GNU General Public License v2 (http://www.gnu.org/licenses/gpl-2.0.html).
- // Those wishing to use Pixy source code, software and/or
- // technologies under different licensing terms should contact us at
- // cmucam@cs.cmu.edu. Such licensing terms are available for
- // all portions of the Pixy codebase presented here.
- //
- // end license header
- //
- #include <SPI.h>
- #include <Pixy.h>
- #include <ipst.h>
- #define X_CENTER 160L
- #define Y_CENTER 100L
- #define RCS_MIN_POS 0L
- #define RCS_MAX_POS 1000L
- #define RCS_CENTER_POS ((RCS_MAX_POS-RCS_MIN_POS)/2)
- class ServoLoop
- {
- public:
- ServoLoop(int32_t pgain, int32_t dgain);
- void update(int32_t error);
- int32_t m_pos;
- int32_t m_prevError;
- int32_t m_pgain;
- int32_t m_dgain;
- };
- ServoLoop panLoop(500, 800);
- ServoLoop tiltLoop(700, 900);
- ServoLoop::ServoLoop(int32_t pgain, int32_t dgain)
- {
- m_pos = RCS_CENTER_POS;
- m_pgain = pgain;
- m_dgain = dgain;
- m_prevError = 0x80000000L;
- }
- void ServoLoop::update(int32_t error)
- {
- long int vel;
- char buf[32];
- if (m_prevError!=0x80000000)
- {
- vel = (error*m_pgain + (error - m_prevError)*m_dgain)>>10;
- //sprintf(buf, "%ld\n", vel);
- //Serial.print(buf);
- m_pos += vel;
- if (m_pos>RCS_MAX_POS)
- m_pos = RCS_MAX_POS;
- else if (m_pos<RCS_MIN_POS)
- m_pos = RCS_MIN_POS;
- //cprintf("%d %d %d\n", m_axis, m_pos, vel);
- }
- m_prevError = error;
- }
- Pixy pixy;
- unsigned long time = 0;
- void setup()
- {
- Serial.begin(9600);
- Serial.print("Starting...\n");
- pixy.init();
- }
- void loop()
- {
- static int i = 0;
- int j;
- uint16_t blocks;
- char buf[32];
- int32_t panError, tiltError;
- blocks = pixy.getBlocks();
- if (blocks)
- {
- panError = X_CENTER-pixy.blocks[0].x;
- tiltError = pixy.blocks[0].y-Y_CENTER;
- panLoop.update(panError);
- tiltLoop.update(tiltError);
- pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);
- i++;
- if (i%5==0)
- {
- if(pixy.blocks[j].x > 190) {
- sr(20);
- time = millis();
- } else if(pixy.blocks[j].x < 130) {
- sl(20);
- time = millis();
- } else {
- ao();
- }
- }
- }
- if(millis() - time > 200) {
- ao();
- time = 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement