OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10973|回复: 29

24l01无线传输摄像头拍的图像,图像位置错乱?

[复制链接]

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
发表于 2013-11-24 17:36:45 | 显示全部楼层 |阅读模式
<center>

<br />
<br />
开发板做显示,最小系统+摄像头采集图像<center>

</center>这是摄像头要照的东西<center>

<center><center>

</center><br />
</center><br />
</center><center>

</center><br />
<br />
<br />
二楼上程序,希望来点指导,为啥会这样?不胜感激<br />
</center><br />
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-4-3
在线时间
3 小时
发表于 2018-3-26 08:57:28 | 显示全部楼层
楼主,你还在不?求程序源码,真心不会啊
回复 支持 1 反对 0

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-24 17:46:55 | 显示全部楼层
这是发射端的程序:
<br>int&nbsp;main()
<br>{
<br>        u8&nbsp;lightmode=0,saturation=2,brightness=2,contrast=2;
<br>        u8&nbsp;effect=0;
<br>        u32&nbsp;j;
<br>&nbsp;        u8&nbsp;color;
<br>        u8&nbsp;t=0;
<br>
<br>        while(OV7670_Init());//初始化OV7670
<br>        OV7670_Light_Mode(lightmode);
<br>        OV7670_Color_Saturation(saturation);
<br>        OV7670_Brightness(brightness);
<br>        OV7670_Contrast(contrast);
<br>&nbsp;        OV7670_Special_Effects(0);
<br>
<br>        EXTI8_Init();                                                //使能定时器捕获
<br>        OV7670_Window_Set(10,174,240,320);        //设置窗口        &nbsp;&nbsp;
<br>&nbsp;&nbsp;        OV7670_CS=0;
<br>                                                                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        &nbsp;&nbsp;        &nbsp;&nbsp;&nbsp;                                                        &nbsp;&nbsp;&nbsp;&nbsp;       
<br>        NRF24L01_TX_Mode();&nbsp;
<br>        tmp_buf[0]=0xf0;
<br>        while(!(NRF24L01_TxPacket(tmp_buf)==TX_OK))        delay_us(100);
<br>while(1)
<br>{&nbsp;
<br>
<br>                        if(ov_sta==2)
<br>                        {                                       
<br>                                OV7670_RRST=0;                                //开始复位读指针&nbsp;
<br>                                OV7670_RCK=0;
<br>                                OV7670_RCK=1;
<br>                                OV7670_RCK=0;
<br>                                OV7670_RRST=1;                                //复位读指针结束&nbsp;
<br>                                OV7670_RCK=1;&nbsp;&nbsp;
<br>                                for(j=0;j&lt;76800;j++)
<br>                                {
<br>                                        OV7670_RCK=0;
<br>                                        color=GPIOC-&gt;IDR&0XFF;        //读数据
<br>                                        OV7670_RCK=1;
<br>                                        tmp_buf[t]=color;
<br>                                        t++;&nbsp;
<br>
<br>                                        OV7670_RCK=0;
<br>                                        color=GPIOC-&gt;IDR&0XFF;        //读数据
<br>                                        OV7670_RCK=1;
<br>                                        tmp_buf[t]=color;
<br>                                        t++;
<br>                                        if(t&gt;=32)
<br>                                        {        &nbsp;&nbsp;&nbsp;
<br>                                                t=0;
<br>                                                while(&nbsp;!(NRF24L01_TxPacket(tmp_buf)==TX_OK)&nbsp;)        delay_us(10);
<br>                                        }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>                                }&nbsp;&nbsp;&nbsp;                                                        &nbsp;
<br>                                EXTI-&gtR=1&lt;&lt;8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                        //清除LINE8上的中断标志位
<br>                                ov_sta=0;                                        //开始下一次采集
<br>                        }
<br>}
<br>}
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-24 17:47:48 | 显示全部楼层
这是开发板接收显示的程序:
<br>int&nbsp;main()
<br>{
<br>        u16&nbsp;j;
<br>        u8&nbsp;t=0;
<br>&nbsp;        u16&nbsp;color;
<br>
<br>        LCD_Init();                        &nbsp;&nbsp;&nbsp;        //初始化LCD
<br>        if(lcddev.id==0X6804)&nbsp;        //强制设置屏幕分辨率为320*240.以支持3.5寸大屏
<br>        {
<br>                lcddev.width=240;
<br>                lcddev.height=320;&nbsp;
<br>        }
<br>        NRF24L01_Init();&nbsp;&nbsp;&nbsp;&nbsp;        //初始化NRF24L01
<br>        &nbsp;while(NRF24L01_Check())        //检查NRF24L01是否在位.       
<br>        {
<br>                LCD_ShowString(60,130,200,16,16,&quot;NRF24L01&nbsp;Error&quot;);
<br>                delay_ms(200);
<br>                LCD_Fill(60,130,239,130+16,WHITE);
<br>&nbsp;                delay_ms(200);
<br>        }
<br>                                                                &nbsp;&nbsp;&nbsp;
<br>
<br>        NRF24L01_RX_Mode();
<br>        while(NRF24L01_RxPacket(tmp_buf))        delay_us(100);
<br>
<br>        while(1)
<br>        {       
<br>                if(tmp_buf[0]==0xf0)
<br>                {
<br>                        LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右&nbsp;
<br>                        LCD_SetCursor(0x00,0x0000);        //设置光标位置&nbsp;
<br>                        LCD_WriteRAM_Prepare();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始写入GRAM
<br>
<br>                        NRF24L01_RX_Mode();
<br>
<br>                        for(j=0;j&lt;4800;j++)
<br>                        {        &nbsp;       
<br>                                while(NRF24L01_RxPacket(tmp_buf))        delay_us(10);
<br>                                       
<br>                                for(t=0;t&lt;32;t+=2)
<br>                                {
<br>                                        color=tmp_buf[t];
<br>                                        color&lt;&lt;=8;
<br>                                        color|=tmp_buf[t+1];&nbsp;
<br>                                        LCD-&gt;LCD_RAM=color;
<br>                                }                                &nbsp;&nbsp;&nbsp;
<br>                        }
<br>                        while(1);                                        //只接一帧停在这
<br>                        LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
<br>                &nbsp;}
<br>                &nbsp;else
<br>                &nbsp;        &nbsp;while(NRF24L01_RxPacket(tmp_buf))        delay_us(100);
<br>        }
<br>}
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-24 17:48:50 | 显示全部楼层
这只是主函数,子函数都是用的原子哥的,真心求解为什么会出这现象
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-11-24 17:59:05 | 显示全部楼层
参考下这个:<a href="http://www.openedv.com/posts/list/24368.htm" target="_blank">http://www.openedv.com/posts/list/24368.htm</a>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2013-11-24 19:01:52 | 显示全部楼层
回复【5楼】正点原子:
<br>---------------------------------
<br>这个代码我看了下&nbsp;校验啊什么的都没有。采用的读一点写一点。所以速度慢。估计数据也会有错乱的时候。适合娱乐
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-24 22:21:19 | 显示全部楼层
回复【5楼】正点原子:
<br>---------------------------------
<br>原子哥&nbsp;&nbsp;我看了他的程序,跟我写的差不多的啊,连发送数据的顺序格式都一样,但是我的老是出现分屏现象,就是上半屏显示下半图,下半屏显示上半图,而且分屏是随机分的,有时候还自动变拍摄的模式,真郁闷了
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-24 22:57:11 | 显示全部楼层
<center>

<br />
<br />
调的好一点丁了,不明白为什么前面一点还好,后面就错位了呢?</center><br />
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-25 10:02:13 | 显示全部楼层
回复【8楼】we-are:
<br>---------------------------------
<br>是不是杜邦线有干扰,你可以试试用战舰那边接摄像头采集,数据比较稳定些
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-25 10:37:24 | 显示全部楼层
回复【9楼】xiaoyan:
<br>---------------------------------
<br>我感觉应该不是啊,是固定的出现这种错误,如果是杜邦线干扰的话,错误应该是随即的啊。。。再说我如果插在开发板上,怎么测试无线传输?
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-11-25 20:33:54 | 显示全部楼层
楼主试着传输一张黑白相间的彩条图片,过去试试看效果.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-25 21:22:05 | 显示全部楼层
终于调好了,用的最最笨拙的方法,还有个小缺点,就是中间下面会有半条白线,不知道那半条的像素去哪了。。。不过这样我也知足了                                         
                                                                            <br />
这是现在的效果<center>

</center><br />
<br />
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-25 21:27:46 | 显示全部楼层
我是在7楼图片的错误数据基础上改的,在接收端修改显示像素的顺序,把错误的像素移到到正确的位置。。也就是说,屏的前1/3是好的,不用改,最后1/3上下颠倒了,我就在接收端把下半屏移到上半屏,上面移到下面。。至于中间的那部分,我找好了错误的线性规律,根据规律做线性修改,最终把全部的错误位置都纠正了过来,但是最后中间的那半条像素真的不知道去哪了,就这样吧。下面上接收端纠正像素的程序。
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-25 21:33:52 | 显示全部楼层
LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右&nbsp;
<br>                        LCD_SetCursor(0x00,0x0000);        //设置光标位置&nbsp;
<br>                        LCD_WriteRAM_Prepare();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始写入GRAM
<br>
<br>                        for(j=0;j&lt;4800;j++)
<br>                        {        &nbsp;       
<br>                                while(NRF24L01_RxPacket(tmp_buf))        delay_us(10);
<br>               
<br>                                for(t=0;t&lt;32;t+=2)
<br>                                {
<br>                                        color=tmp_buf[t];
<br>                                        color&lt;&lt;=8;
<br>                                        color|=tmp_buf[t+1];&nbsp;
<br>                                        if(j&gt;=1680)
<br>                                        {
<br>                                                if(num==0)
<br>                                                        OV7670_DrawPoint(320-107,j/20,color);
<br>
<br>                                                if(num==107)
<br>                                                        OV7670_DrawPoint(0,j/20,color);       
<br>
<br>                                                if(num!=0&&num!=107)
<br>                                                        LCD-&gt;LCD_RAM=color;
<br>
<br>                                                num++;
<br>                                                if(num&gt;=320)
<br>                                                num=0;
<br>                                        }
<br>                                        else
<br>                                                if(j&gt;=1140)
<br>                                                {
<br>                                                        zun=j/20;
<br>                                                        zun=zun*4-225;
<br>                                                        if(lin==0)
<br>                                                                OV7670_DrawPoint(320-zun+4,j/20-1,color);
<br>
<br>                                                        if(lin==zun)
<br>                                                                OV7670_DrawPoint(0,j/20,color);
<br>                                                                       
<br>                                                        if(lin!=0&&lin!=zun)
<br>                                                                LCD-&gt;LCD_RAM=color;
<br>
<br>                                                        lin++;
<br>                                                        if(lin&gt;=320)
<br>                                                                lin=0;
<br>               
<br>                                                }
<br>                                                else
<br>                                                        if(j&gt;=1120)
<br>                                                        {
<br>                                                                if(yin==0)
<br>                                                                        OV7670_DrawPoint(0,j/20,color);
<br>                                                                else
<br>                                                                        LCD-&gt;LCD_RAM=color;
<br>
<br>                                                                yin++;
<br>                                                                if(yin&gt;=320)
<br>                                                                        yin=0;
<br>               
<br>                                                }
<br>                                                else
<br>                                                        {
<br>                                                                if(yum==0)
<br>                                                                        OV7670_DrawPoint(4,j/20,color);
<br>                                                                else
<br>                                                                        LCD-&gt;LCD_RAM=color;
<br>
<br>                                                                yum++;
<br>                                                                if(yum&gt;=320)
<br>                                                                        yum=0;
<br>                                                        }
<br>
<br>                                }
<br>
<br>
<br>
<br>
<br>就显示的这部分不一样,其他的都一样,前1/3整体下移4个像素,后1/3上下调换,中间1/3线性移动然后再整体上移4个像素。OK
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-25 21:37:27 | 显示全部楼层
回复【11楼】正点原子:
<br>---------------------------------
<br>原子哥,我感觉接收程序和发射的应该都没问题,在弄摄像头之前我调无线的时候我发过彩色相间的图片,没问题的。我估计是读摄像头的时候中间不知道为什么数据顺序就乱了,现在我用最笨的方法在接收端硬纠正过来了。。。真的好奇怪
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2013-11-25 22:00:02 | 显示全部楼层
额,好吧,经过测试,无线距离20cm,超过20就乱了,屏幕就分成好几块了。。。。是不是要搞个天线??
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-11-27 11:03:14 | 显示全部楼层
回复【16楼】we-are:
<br>---------------------------------
<br>就是中间有数据丢失,你加上验证吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

340

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2013-12-17
在线时间
100 小时
发表于 2014-5-14 19:48:46 | 显示全部楼层
问下楼主7楼那张图片是什么原因造成的啊,&nbsp;我rgb格式没有&nbsp;&nbsp;yuv就变成和你图像一样的情况了,而且斜率比你的还大&nbsp;&nbsp;怎么改的&nbsp;谢谢
就算有一天梦想成真,而你做好准备了吗?
回复 支持 反对

使用道具 举报

19

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-11-24
在线时间
8 小时
 楼主| 发表于 2014-5-16 12:52:50 | 显示全部楼层
回复【18楼】老虎的菜:
<br>---------------------------------
<br>我也不知道什么原因造成的。改的时候就是找到像素的错乱的线性规律,硬把像素人工挪到应该的位置,反正挺麻烦的
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-2-21
在线时间
0 小时
发表于 2015-3-12 22:37:49 | 显示全部楼层
回复【2楼】we-are:
<br>---------------------------------
<br>楼主为什么我用你这个程序不好使已经检查很多次了思路也和你差不多但是24l01不能通信
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-2-21
在线时间
0 小时
发表于 2015-4-9 22:01:13 | 显示全部楼层
回复【17楼】正点原子:
<br>---------------------------------
<br>原子哥请问你那个ADXL345能不能不用PF11脚?我的小系统上没有PF11脚现在用小系统采集不了数据一直不知道为什么。??
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-4-9 22:45:51 | 显示全部楼层
回复【21楼】伏笛:
<br>---------------------------------
<br>可以啊,你看是不是代码有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-2-21
在线时间
0 小时
发表于 2015-4-10 07:47:48 | 显示全部楼层
回复【22楼】正点原子:
<br>---------------------------------
<br>我用战舰开发版就能采集数据但是用我的小系统就不能而且我查它两对应的PB10和PB11它们对应的口的脚的功能都是相同的但是就是不能采集数据不知道为什么
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-4-9
在线时间
1 小时
发表于 2015-4-16 17:53:08 | 显示全部楼层
回复【12楼】we-are:
<br>---------------------------------
<br>请问你是怎么调的???
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-15
在线时间
4 小时
发表于 2015-7-4 14:13:19 | 显示全部楼层
楼主,可以加你的qq吗?我的是2963960660。谢谢了!
我努力,我快乐,我就是我。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-4-3
在线时间
3 小时
发表于 2018-3-27 10:44:20 | 显示全部楼层
楼主,不知道你还在不在,我按照你的程序调出来了,一开始现象和你的是一样的。静止不动的画面在lcd显示上也是上下滚动的。后来,将你程序里关于发送,接收的延时,如while(NRF24L01_RxPacket(tmp_buf)) delay_us(10);这种语句,都改成了while(NRF24L01_RxPacket(tmp_buf));演示部分都去掉了。现象是上下不滚动了。但是图像上半部分在lcd显示屏下面,下半部分在lcd显示屏上面。后来经过调试,把你的程序里面关于校验的部分 tmp_buf[0]=0xf0;全去掉了。现在摄像头显示已经没问题了,就是nrf通信慢了,大概2s一幅图片的样子。

回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-4-3
在线时间
3 小时
发表于 2018-3-27 10:45:51 | 显示全部楼层
上文打错了一个字,是延时,不是演示


还有一句话,奉劝还没做的小伙伴,用wifi吧,不要用nrf,虽然可以,但是并不是实时显示的,2s一帧
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-4-3
在线时间
3 小时
发表于 2018-3-27 19:29:48 | 显示全部楼层
找到真正的原因了,不是校验去掉的问题。是原子哥的代码里,有一个NRF24L01_RX_Mode();
接收配置里面的NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答。

将自动应答的0x01改为0x00,失能就可以了。
但是不理解为什么,求原子哥解答

回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-4-22
在线时间
4 小时
发表于 2020-4-25 18:24:28 来自手机 | 显示全部楼层
追随你的足迹 发表于 2018-3-27 19:29
找到真正的原因了,不是校验去掉的问题。是原子哥的代码里,有一个NRF24L01_RX_Mode();
接收配置里面的NRF ...

在吗,求源码,想作为参考
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 11:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表