capstone_finish
Dependencies: BufferedSerial motor_sn7544
main.cpp
- Committer:
- Jeonghoon
- Date:
- 2019-11-26
- Revision:
- 10:ca4e4062701a
- Parent:
- 9:ccd662244071
File content as of revision 10:ca4e4062701a:
// // OV7670 + FIFO AL422B camera board test // #include "mbed.h" #include "ov7670.h" #include "motor.h" #include "ros.h" #include <ros/time.h> #include <std_msgs/UInt8MultiArray.h> #include <std_msgs/Byte.h> #include <std_msgs/Bool.h> #include <std_msgs/Float64.h> #include <std_msgs/Int32.h> #include <std_msgs/String.h> BusOut bus(PC_0,PC_1); MotorCtl motor1(PB_13,bus,PB_14,PB_15); InterruptIn tachoINT1(PB_14); InterruptIn tachoINT2(PB_15); void goalVelCb(const std_msgs::Float64& msg){ motor1.setTarget(msg.data); } std_msgs::Float64 cum_dist; std_msgs::Float64 rela_dist; std_msgs::Float64 curr_vel; std_msgs::Int32 curr_rpm; std_msgs::UInt8MultiArray img; //std_msgs::Byte img; std_msgs::Bool sync; ros::NodeHandle nh_motor; ros::NodeHandle_cam nh_cam; ros::Publisher img_pub("image_data", &img); ros::Publisher sync_pub("sync", &sync); ros::Publisher cum_dist_pub("cum_dist", &cum_dist); ros::Publisher rela_dist_pub("rela_dist", &rela_dist); ros::Publisher rpm_pub("rpm", &curr_rpm); ros::Publisher curr_vel_pub("curr_vel", &curr_vel); ros::Subscriber<std_msgs::Float64> goal_vel_sub("goal_vel", &goalVelCb); OV7670 camera( D14,D15, // SDA,SCL(I2C / SCCB) D9,D8,D11, // VSYNC,HREF,WEN(FIFO) //p18,p17,p16,p15,p11,p12,p14,p13, // D7-D0 PortB,0x00FF, D13,D12,D6,D2) ; // RRST,OE,RCLK,WRST //Serial pc(USBTX,USBRX,115200) ; #define NUMBYTE 480 //#undef QQVGA #define QQVGA #ifdef QQVGA # define SIZEX (160) # define SIZEY (120) #else # define SIZEX (320) # define SIZEY (240) #endif uint8_t fdata[SIZEX*SIZEY]; uint8_t fdata_ros[NUMBYTE]; int loop_num; size_t size = SIZEX*SIZEY; int index=0; volatile int flag; void update_current(void) { motor1.UpdateCurrentPosition(); } int main() { int rpm; float velocity; float reladistance; //m단위 float cumdistance; tachoINT1.fall(&update_current); tachoINT1.rise(&update_current); tachoINT2.fall(&update_current); tachoINT2.rise(&update_current); wait(1); motor1.setTarget(10); nh_cam.initNode(); nh_motor.initNode(); loop_num = size/NUMBYTE; sync.data=true; wait_ms(1); // pc.baud(115200) ; camera.Reset() ; nh_cam.advertise(img_pub); nh_cam.advertise(sync_pub); nh_motor.advertise(cum_dist_pub); nh_motor.advertise(rela_dist_pub); nh_motor.advertise(rpm_pub); nh_motor.subscribe(goal_vel_sub); #ifdef QQVGA // camera.InitQQVGA565(true,false) ; camera.InitQQVGAYUV(false,false); #else //camera.InitQVGA565(true,false) ; #endif // CAPTURE and SEND LOOP while(1) { camera.CaptureNext() ; while(camera.CaptureDone() == false) ; camera.ReadStart() ; //motor rpm = motor1.getRPM(); cumdistance = motor1.CalculateCumDis(); // 누적거리 reladistance = motor1.CalculateRelaDis(); // 상대거리 velocity = motor1.CalculateVelocity(); //motor end sync.data=true; for (int y = 0; y < SIZEX*SIZEY ; y++) { camera.ReadOneByte(); fdata[y]=camera.ReadOneByte(); } camera.ReadStop() ; for(int x=0; x< loop_num; x++) { for(int y=0; y < NUMBYTE; y++) { fdata_ros[y]=fdata[(NUMBYTE*(x))+y]; } sync_pub.publish(&sync); img.data_length = NUMBYTE; img.data = &fdata_ros[0]; img_pub.publish(&img); //motor cum_dist.data = cumdistance; cum_dist_pub.publish(&cum_dist); rela_dist.data = reladistance; rela_dist_pub.publish(&rela_dist); curr_rpm.data = rpm; rpm_pub.publish(&curr_rpm); //motor end nh_cam.spinOnce(); nh_motor.spinOnce(); sync.data=false; wait_us(4687.5); // 3125 us , 1843200 baudrate for camera // 950 ~ 1000 us for motor } } }